一 連接數(shù)據(jù)庫
在Flask-SQLAlchemy 中睹栖,數(shù)據(jù)庫被指定為URL,MySQL的數(shù)據(jù)庫引擎的URL格式如下:
mysql://username:password@hostname/database
hostname 托管MySQL服務(wù)的服務(wù)器抹镊,也可以是遠(yuǎn)程服務(wù)器
database 要使用的數(shù)據(jù)庫名
username password 使用數(shù)據(jù)庫的用戶憑證
SQLALCHEMY_COMMIT_ON_TEARDOWN可以設(shè)置為True舟误,
來啟用自動提交數(shù)據(jù)庫更改在每個請求中
由SQLAlchemy實(shí)例化的db對象表示數(shù)據(jù)庫且提供訪問Flask-SQLAlchemy的所有功能
二 定義數(shù)據(jù)庫
tablename類變量定義數(shù)據(jù)庫中表的名稱崔泵。
如果tablename缺省,F(xiàn)lask-SQLAlchemy會指定默認(rèn)的表名嫉髓,但是這些缺省名稱不遵守使用復(fù)數(shù)命名的約定倘零,所以最好是顯式命名表名。
其余的變量是模型的屬性幻梯,被定義為db.Column類的實(shí)例
傳給db.Column構(gòu)造函數(shù)的第一個參數(shù)是數(shù)據(jù)庫列的類型也就是模型屬性的數(shù)據(jù)類型
見flask-sqlalchemy使用(基礎(chǔ)知識)
db.Column剩余的參數(shù)為每個屬性指定了配置選項(xiàng)
見flask-sqlalchemy使用(基礎(chǔ)知識)
模型包含了repr()方法來給它們顯示一個可讀字符串兜畸,雖然不是完全必要,不過用于調(diào)試和測試還是很不錯的
三 建立外鍵
添加給User模型的role_id列被定義為外鍵碘梢,且建立關(guān)系咬摇。
db.ForeignKey()的參數(shù)roles.id指定的列應(yīng)該理解為在roles表的行中持有id值的列
添加到Role模型的users屬性表現(xiàn)了關(guān)系的面向?qū)ο蟮挠^點(diǎn)。給定Role類的實(shí)例煞躬,
users屬性會返回一組連接到該角色的用戶肛鹏。指定給db.relationship()的第一個參數(shù)表明模型中關(guān)系的另一邊。如果類還未定義恩沛,這個模型可以作為字符串提供在扰。
ForeignKey類的column接收三種類型的參數(shù),
一種是“模型名.屬性名”雷客;
一種是“表名.列名”芒珠,
最后一種沒看明白,下次試著用一下搅裙。
db.relationship()的backref參數(shù)通過給User模型增加role屬性來定義反向關(guān)系皱卓。這個屬性可以替代role_id訪問Role模型,是作為對象而不是外鍵部逮。
大多數(shù)情況下db.relationship()可以定位自己的外鍵關(guān)系娜汁,但是有時候不能確定哪個列被用作外鍵。例如甥啄,如果User模型有兩個或更多列被定義為Role的外鍵存炮,SQLAlchemy將不知道使用兩個中的哪一個。每當(dāng)外鍵配置模棱兩可的時候,就必須使用額外參數(shù)db.relationship()穆桂。表格5-4列出一些常用配置選項(xiàng)用于定義關(guān)系宫盔。