關係型資料庫使用關係把不同表中的行聯絡起來。上篇隨筆中介紹的使用者和角色之間是一種簡單的關係。即角色到使用者的一對多關係,因為乙個角色可屬於多個使用者,而每個使用者都只能有乙個角色。這種關係在模型中的表示方法如下:
classrole(db.model):
__tablename__ = '
roles
'id = db.column(db.integer,primary_key=true)
name = db.column(db.string(64),unique=true)
users = db.relationship('
user
', backref='
role')
def __repr__(self):
return
'' %self.name
class
user(db.model):
__tablename__ = '
users
'id = db.column(db.integer,primary_key=true)
name = db.column(db.string(64),unique=true)
role_id = db.column(db.integer, db.foreignkey('
roles.id'))
def __repr__(self):
return
'' % self.name
關係使用users 表中的外來鍵連線了兩行。新增到user 模型中的role_id 列被定義為外來鍵,就是這個外來鍵建立起了關係。傳給db.foreignkey() 的引數'roles.id' 表明,這列的值是roles 表中行的id 值。
新增到role 模型中的users 屬性代表這個關係的物件導向視角。對於乙個role 類的例項,其users 屬性將返回與角色相關聯的使用者組成的列表。db.relationship() 的第乙個引數表明這個關係的另一端是哪個模型。如果模型類尚未定義,可使用字串形式指定。
db.relationship() 中的backref 引數向user 模型中新增乙個role 屬性,從而定義反向關係。這一屬性可替代role_id 訪問role 模型,此時獲取的是模型物件,而不是外來鍵的值。
大多數情況下,db.relationship() 都能自行找到關係中的外來鍵,但有時卻無法決定把哪一列作為外來鍵。例如,如果user 模型中有兩個或以上的列定義為role 模型的外來鍵,sqlalchemy 就不知道該使用哪列。如果無法決定外來鍵,你就要為db.relationship() 提供額外引數,從而確定所用外來鍵。下表列出了定義關係時常用的配置選項。
backref
在關係的另乙個模型中新增反向引用
primaryjoin
明確指定兩個模型之間使用的聯結條件。只在模稜兩可的關係中需要指定
lazy
指定如何載入相關記錄。可選值有select(首次訪問時按需載入)、immediate(源物件載入後就載入)、joined(載入記錄,但使用聯結)、subquery(立即載入,但使用子查詢),noload(永不載入)和dynamic(不載入記錄,但提供載入記錄的查詢)
uselist
如果設為fales,不使用列表,而使用標量值
secondary
指定多對多關係中關係表的名字
secondaryjoin
sqlalchemy 無法自行決定時,指定多對多關係中的二級聯結條件
除了一對多之外,還有幾種其他的關係型別。一對一關係可以用前面介紹的一對多關係表示,但呼叫db.relationship() 時要把uselist 設為false,把「多」變成「一」。多對一關係也可使用一對多表示,對調兩個表即可,或者把外來鍵和db.relationship() 都放在「多」這一側。由於多對多關係比較複雜,後面會在專門的專題詳細介紹。
Flask從入門到精通之flask擴充套件
flask被設計成可擴充套件形式,因此並沒有提供一些重要的功能,比如資料庫和使用者認證,所以開發者可以自由選擇最適合程式的包,或者按需求自行開發。社群成員開發了大量不同用途的擴充套件,如果這還不能滿足需求,你還可使用所有python 標準包或 庫。為了讓你知道如何把擴充套件整合到程式中,接下來我們將...
Flask從入門到精通之flask安裝
安裝flask最簡單的方式是使用虛擬環境,虛擬環境是python直譯器的乙個私有副本,在這個環境中你可以安裝私有包,而且不會影響系統中安裝的全域性的python直譯器。虛擬環境非常有用,可以在系統的python 直譯器中避免包的混亂和版本的衝突。為每個程式單獨建立虛擬環境可以保證程式只能訪問虛擬環境...
Flask從入門到精通之flask程式入門
所有flask程式都必須建立乙個程式例項,web伺服器使用一種名為web伺服器閘道器介面的的協議 wsgi 把接收自客戶端的所有請求 給這個物件處理。程式例項是flask類的物件,使用下面 構建 from flask import flaskflask類的建構函式只有乙個必須指定的引數,即程式主模組...