flask-SQLAlchemy

Simple Example

簡(jiǎn)單的一個(gè)例子:

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

    def __repr__(self):
        return '<User %r>' % self.username

使用Column定義一個(gè)字段。
常用字段類(lèi)型:

類(lèi)型 說(shuō)明
Integer 整數(shù)
String(size) 有最大長(zhǎng)度的字符串
Text 長(zhǎng)unicode文本
DateTime 表示datetime對(duì)象的時(shí)間和日期
Float 存儲(chǔ)浮點(diǎn)值
Boolean 存儲(chǔ)布爾值
PickleType 存儲(chǔ)一個(gè)持久化python對(duì)象
LargeBinary 存儲(chǔ)任意大的二進(jìn)制數(shù)據(jù)

One-to-Many Relationships

最常用的關(guān)系就是一對(duì)多關(guān)系。因?yàn)殛P(guān)系在它們建立之前就已經(jīng)聲明,你可以使用 字符串來(lái)參考還沒(méi)有創(chuàng)建的類(lèi)(比如如果 Person 定義了一個(gè)到 Address 的 關(guān)系,而這個(gè)關(guān)系在文件的后面才會(huì)聲明)。
關(guān)系用函數(shù)relationship()來(lái)表示。而外鍵必須用sqlalchemy.schema.ForeignKey來(lái)單獨(dú)聲明:

class Person(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    addresses = db.relationship('Address', backref='person',
                                lazy='dynamic')

class Address(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(50))
    person_id = db.Column(db.Integer, db.ForeignKey('person.id'))

db.relationship() 做了什么?這個(gè)函數(shù)返回一個(gè)可以做許多事情的屬性。 在本案例中,我們讓它指向 Address 類(lèi)并加載那些中的多個(gè)。它如何知道這 會(huì)返回至少一個(gè)地址?因?yàn)?SQLALchemy 從你的聲明中猜測(cè)了一個(gè)有用的默認(rèn)值。 如果你想要一對(duì)一聯(lián)系,你可以把 uselist=False 傳給relationship().

So what do backref and lazy mean? backref is a simple way to also declare a new property on the Address class. You can then also use my_address.person to get to the person at that address. lazy defines when SQLAlchemy will load the data from the database:

那么 backref 和 lazy 意味著什么? backref 是一個(gè)同樣在 Address 類(lèi) 上聲明新屬性的簡(jiǎn)單方法。你之后也可以用 my_address.person 來(lái)獲取這個(gè)地址 的人。 lazy 決定了 SQLAlchemy 什么時(shí)候從數(shù)據(jù)庫(kù)中加載數(shù)據(jù):

  • 'select' (默認(rèn)值)意味著 SQLAlchemy 會(huì)在使用一個(gè)標(biāo)準(zhǔn) select 語(yǔ)句 時(shí)一氣呵成加載那些數(shù)據(jù).
  • 'joined' 讓 SQLAlchemy 當(dāng)父級(jí)使用 JOIN 語(yǔ)句是,在相同的查詢(xún)中加 載關(guān)系。
  • 'subquery' 類(lèi)似 'joined' ,但是 SQLAlchemy 會(huì)使用子查詢(xún)。
  • 在你有很多條目的時(shí)侯是特別有用的。 SQLAlchemy 會(huì)返回另一個(gè)查詢(xún)對(duì)象,你可以在加載這些條目時(shí)進(jìn)一步提取。如果不僅想要關(guān)系下的少量條目 時(shí),這通常是你想要的。

你如何為反向引用(backrefs)定義惰性(lazy)狀態(tài)?使用backref()函數(shù):

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), nullable=False)
    addresses = db.relationship('Address', lazy='select',
        backref=db.backref('person', lazy='joined'))

Many-to-Many Relationships

如果你想要用多對(duì)多關(guān)系,你需要定義一個(gè)用于關(guān)系的輔助表。對(duì)于這個(gè)輔助表, 強(qiáng)烈建議不使用模型,而是采用一個(gè)實(shí)際的表:

tags = db.Table('tags',
    db.Column('tag_id', db.Integer, db.ForeignKey('tag.id')),
    db.Column('page_id', db.Integer, db.ForeignKey('page.id'))
)

class Page(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    tags = db.relationship('Tag', secondary=tags,
        backref=db.backref('pages', lazy='dynamic'))

class Tag(db.Model):
    id = db.Column(db.Integer, primary_key=True)

在relationship()方法傳入secondary參數(shù),其值為關(guān)聯(lián)表的表名。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容