摘要:關系關系數據庫通過使用關系在不同的表中建立連接。以下部分將介紹最常見的數據庫操作。如果數據庫已存在函數不會重新創建或更新數據庫表。到目前為止對象只存于中,他們還沒有被寫入數據庫。數據庫會話也叫事務。刪除行數據庫會話同樣有方法。
7、關系
關系數據庫通過使用關系在不同的表中建立連接。圖像5-1的關系圖表達了用戶和用戶角色之間的簡單關系。這個角色和用戶是一對多關系,因為一個角色可以從屬于多個用戶,而一個用戶只能擁有一個角色。
示例5-3的模型類展示了圖像5-1中表達的一對多關系。
示例5-3. 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"))
就像圖像5-1中看到的那樣,關系通過使用外鍵來連接兩行。添加給User模型的role_id列被定義為外鍵,且建立關系。db.ForeignKey()的參數roles.id指定的列應該理解為在roles表的行中持有id值的列。
添加到Role模型的users屬性表現了關系的面向對象的觀點。給定Role類的實例,users屬性會返回一組連接到該角色的用戶。指定給db.relationship()的第一個參數表明模型中關系的另一邊。如果類還未定義,這個模型可以作為字符串提供。
注意:之前在segmentdefault中遇到的問題,后來粗略閱讀了SQLAlchemy的源碼。ForeignKey類的column接收三種類型的參數,一種是“模型名.屬性名”;一種是“表名.列名”,最后一種沒看明白,下次試著用一下。
db.relationship()的backref參數通過給User模型增加role屬性來定義反向關系。這個屬性可以替代role_id訪問Role模型,是作為對象而不是外鍵。
大多數情況下db.relationship()可以定位自己的外鍵關系,但是有時候不能確定哪個列被用作外鍵。例如,如果User模型有兩個或更多列被定義為Role的外鍵,SQLAlchemy將不知道使用兩個中的哪一個。每當外鍵配置模棱兩可的時候,就必須使用額外參數db.relationship()。表格5-4列出一些常用配置選項用于定義關系。
表格5-4. 常用SQLAlchemy關系選項