一 連接數據庫
在Flask-SQLAlchemy 中,數據庫被指定為URL,MySQL的數據庫引擎的URL格式如下:
mysql://username:password@hostname/database
hostname 托管MySQL服務的服務器,也可以是遠程服務器
database 要使用的數據庫名
username password 使用數據庫的用戶憑證
SQLALCHEMY_COMMIT_ON_TEARDOWN可以設置為True,
來啟用自動提交數據庫更改在每個請求中
由SQLAlchemy實例化的db對象表示數據庫且提供訪問Flask-SQLAlchemy的所有功能
二 定義數據庫
tablename類變量定義數據庫中表的名稱。
如果tablename缺省,Flask-SQLAlchemy會指定默認的表名,但是這些缺省名稱不遵守使用復數命名的約定,所以最好是顯式命名表名。
其余的變量是模型的屬性,被定義為db.Column類的實例
傳給db.Column構造函數的第一個參數是數據庫列的類型也就是模型屬性的數據類型
見flask-sqlalchemy使用(基礎知識)
db.Column剩余的參數為每個屬性指定了配置選項
見flask-sqlalchemy使用(基礎知識)
模型包含了repr()方法來給它們顯示一個可讀字符串,雖然不是完全必要,不過用于調試和測試還是很不錯的
三 建立外鍵
添加給User模型的role_id列被定義為外鍵,且建立關系。
db.ForeignKey()的參數roles.id指定的列應該理解為在roles表的行中持有id值的列
添加到Role模型的users屬性表現了關系的面向對象的觀點。給定Role類的實例,
users屬性會返回一組連接到該角色的用戶。指定給db.relationship()的第一個參數表明模型中關系的另一邊。如果類還未定義,這個模型可以作為字符串提供。
ForeignKey類的column接收三種類型的參數,
一種是“模型名.屬性名”;
一種是“表名.列名”,
最后一種沒看明白,下次試著用一下。
db.relationship()的backref參數通過給User模型增加role屬性來定義反向關系。這個屬性可以替代role_id訪問Role模型,是作為對象而不是外鍵。
大多數情況下db.relationship()可以定位自己的外鍵關系,但是有時候不能確定哪個列被用作外鍵。例如,如果User模型有兩個或更多列被定義為Role的外鍵,SQLAlchemy將不知道使用兩個中的哪一個。每當外鍵配置模棱兩可的時候,就必須使用額外參數db.relationship()。表格5-4列出一些常用配置選項用于定義關系。