接着上次的定義模型。在models.py內寫好Note模型後可以在控制檯查看對應的建表語句:
設置URI後
執行
db.create_all()
成功建立了表note。sqlalchemy是不能建立庫的,所以sqlalchemy庫是我手動創建的。
數據庫和表一旦建立後,之後對模型的改動不回自動作用到實際的表中。例如在創建好表後,再在模型中添加新的字段,這時再次調用create_all()並不會更新表的結構。要想讓改動生效,最簡單的辦法是用db.drop_all()刪除數據庫和表,然後再調用create_all()創建。
執行
db.drop_all()
後刪除了表,同樣無法刪除MySQL的數據庫
數據庫操作
數據庫的主要操作是CRUD,也就是Create(創建)、Read(讀取/查詢)、Upaate(更新)、Delete(刪除)。和增刪改查一個意思。SQLAlchemy使用數據庫會話來管理數據庫操作,數據庫會話也稱爲事務(transaction)。Flask-SQLAlchemy會自動創建會話,可以用db.session屬性獲取。
數據庫的會話代表一個臨時存儲區,存儲了我們對數據庫做出的改動。我們可以利用add()方法添加新會話或者更新原有的會話。只有對數據庫會話對象調用了commit()方法時,改動纔會被提交。調用rollback()方法則會將添加到會話而沒有提交的改動撤銷。
Create
向數據庫添加新記錄可以分爲三步:
- 實例化模型,作爲一條記錄
- 添加記錄到會話
- 提交會話到數據庫
例如向之前的數據庫添加三條消息
Read
一個完整的查詢遵循這個模式:
<模型類>.query.<過濾方法>.<查詢方法>
比較常用的查詢方法有
all()-----返回所有記錄
first()-----返回第一條記錄
get()-----返回指定id的記錄
count()-----返回記錄總數
通過過濾方法可以獲得更精確的查詢,而且過濾方法可以疊加使用。最基礎的查詢過濾器是filter(),用指定的規則來過濾記錄。
查找body字段爲remember THIS的記錄。
也可以查看對應SQL語句
filter中還有其他常用操作符例如:
like
in
not in
and
或者疊加調用多個filter()
Note.query.filter(Note.body.like('%rem%')).filter(Note.id==1).all()
還有一種方法是使用and_(),需要自己import。
or
filter_by()和filter()類似,而且更加簡便。
Update
賦值給模型類的字段屬性就可以直接改變字段值,調用commit()方法提交會話就完成了更新。
Delete
刪和增總是十分相似,只需要把add()方法替換成delete()方法。