Flask從入門到精通之資料模型之間的關係

2022-03-28 03:23:58 字數 1900 閱讀 3487

關係型資料庫使用關係把不同表中的行聯絡起來。上篇隨筆中介紹的使用者和角色之間是一種簡單的關係。即角色到使用者的一對多關係,因為乙個角色可屬於多個使用者,而每個使用者都只能有乙個角色。這種關係在模型中的表示方法如下:  

class

role(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類的建構函式只有乙個必須指定的引數,即程式主模組...