python-flaskweb學習筆記二
在 ORM 中,模型一般是一個 Python 類,類中的屬性對應資料庫表中的列。
最常用的SQLAlchemy列型別
型別名 Python型別 |
說 明 |
Integer |
|
int |
普通整數,一般是 32 位 |
SmallInteger |
|
int |
取值範圍小的整數,一般是 16 位 |
BigInteger |
int 或 long 不限制精度的整數 |
Float |
|
float |
浮點數 |
Numeric |
|
decimal.Decimal |
定點數 |
String |
|
str |
變長字串 |
Text |
|
str |
變長字串,對較長或不限長度的字串做了優化 |
Unicode |
|
unicode |
變長 Unicode 字串 |
UnicodeText |
|
unicode |
變長 Unicode 字串,對較長或不限長度的字串做了優化 |
Boolean |
|
bool |
布林值 |
Date |
|
datetime.date |
日期 |
Time |
|
datetime.time |
時間 |
DateTime |
|
datetime.datetime |
日期和時間 |
Interval |
|
datetime.timedelta |
時間間隔 |
Enum |
|
str |
一組字串 |
PickleType |
任何 Python 物件 自動使用 Pickle 序列化 |
LargeBinary |
|
str |
二進位制檔案 |
hello.py:定義 Role 和 User 模型
class Role(db.Model):
__tablename__ = 'roles'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
def __repr__(self):
return '<Role %r>' % self.name
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True, index=True)
def __repr__(self):
return '<User %r>' % self.username
最常使用的SQLAlchemy列選項
選項名 說 明
primary_key 如果設為 True ,這列就是表的主鍵
unique 如果設為 True ,這列不允許出現重複的值
index 如果設為 True ,為這列建立索引,提升查詢效率
nullable 如果設為 True ,這列允許使用空值;如果設為 False ,這列不允許使用空值
default 為這列定義預設值
常用的SQLAlchemy關係選項
選項名 說 明
backref 在關係的另一個模型中新增反向引用
primaryjoin 明確指定兩個模型之間使用的聯結條件。只在模稜兩可的關係中需要指定
lazy 指定如何載入相關記錄。可選值有 select (首次訪問時按需載入)、 immediate (源物件加
載後就載入)、 joined (載入記錄,但使用聯結)、 subquery (立即載入,但使用子查詢),
noload (永不載入)和 dynamic (不載入記錄,但提供載入記錄的查詢)
hello.py:關係
class Role(db.Model):
# ...
users = db.relationship('User', backref='role')
class User(db.Model):
# ...
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
SQLAlchemy 為很多資料庫引擎提供抽象層
資料庫
會話也稱為事務
資料庫會話能保證資料庫的一致性。提交操作使用原子方式把會話中的物件全部寫入資料
庫。
資料庫會話也可 回滾 。呼叫 db.session.rollback() 後,新增到資料庫會話
中的所有物件都會還原到它們在資料庫時的狀態。
常用的SQLAlchemy查詢過濾器
過濾器 |
說 明 |
filter() |
把過濾器新增到原查詢上,返回一個新查詢 |
filter_by() |
把等值過濾器新增到原查詢上,返回一個新查詢 |
limit() |
使用指定的值限制原查詢返回的結果數量,返回一個新查詢 |
offset() |
偏移原查詢返回的結果,返回一個新查詢 |
order_by() |
根據指定條件對原查詢結果進行排序,返回一個新查詢 |
group_by() |
根據指定條件對原查詢結果進行分組,返回一個新查詢 |
最常使用的SQLAlchemy查詢執行函式
方 法 |
說 明 |
all() |
以列表形式返回查詢的所有結果 |
first() |
返回查詢的第一個結果,如果沒有結果,則返回 None |
first_or_404() |
返回查詢的第一個結果,如果沒有結果,則終止請求,返回 404 錯誤響應 |
get() |
返回指定主鍵對應的行,如果沒有對應的行,則返回 None |
get_or_404() |
返回指定主鍵對應的行,如果沒找到指定的主鍵,則終止請求,返回 404 錯誤響應 |
count() |
返回查詢結果的數量 |
paginate() |
返回一個 Paginate 物件,它包含指定範圍內的結果 |
@app.route('/', methods=['GET', 'POST'])
def index():
form = NameForm()
if form.validate_on_submit():
user = User.query.filter_by(username=form.name.data).first()
if user is None:
user = User(username = form.name.data)
db.session.add(user)
session['known'] = False
else:
session['known'] = True
session['name'] = form.name.data
form.name.data = ''
return redirect(url_for('index'))
return render_template('index.html',
form = form, name = session.get('name'),
known = session.get('known', False))