flask-SQLAlchemy

Simple Example

簡單的一個例子:

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定義一個字段肝谭。
常用字段類型:

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

One-to-Many Relationships

最常用的關(guān)系就是一對多關(guān)系妨猩。因為關(guān)系在它們建立之前就已經(jīng)聲明萝究,你可以使用 字符串來參考還沒有創(chuàng)建的類(比如如果 Person 定義了一個到 Address 的 關(guān)系,而這個關(guān)系在文件的后面才會聲明)酗电。
關(guān)系用函數(shù)relationship()來表示监署。而外鍵必須用sqlalchemy.schema.ForeignKey來單獨聲明:

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() 做了什么?這個函數(shù)返回一個可以做許多事情的屬性寄啼。 在本案例中逮光,我們讓它指向 Address 類并加載那些中的多個。它如何知道這 會返回至少一個地址墩划?因為 SQLALchemy 從你的聲明中猜測了一個有用的默認(rèn)值睦霎。 如果你想要一對一聯(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 是一個同樣在 Address 類 上聲明新屬性的簡單方法副女。你之后也可以用 my_address.person 來獲取這個地址 的人。 lazy 決定了 SQLAlchemy 什么時候從數(shù)據(jù)庫中加載數(shù)據(jù):

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

你如何為反向引用(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

如果你想要用多對多關(guān)系棋返,你需要定義一個用于關(guān)系的輔助表延都。對于這個輔助表, 強(qiáng)烈建議不使用模型睛竣,而是采用一個實際的表:

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)容合作請聯(lián)系作者
  • 序言:七十年代末射沟,一起剝皮案震驚了整個濱河市殊者,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌验夯,老刑警劉巖猖吴,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異挥转,居然都是意外死亡距误,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門扁位,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人趁俊,你說我怎么就攤上這事域仇。” “怎么了寺擂?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵暇务,是天一觀的道長。 經(jīng)常有香客問我怔软,道長垦细,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任挡逼,我火速辦了婚禮括改,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘家坎。我一直安慰自己嘱能,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布虱疏。 她就那樣靜靜地躺著惹骂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪做瞪。 梳的紋絲不亂的頭發(fā)上对粪,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼著拭。 笑死纱扭,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的茫死。 我是一名探鬼主播跪但,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼峦萎!你這毒婦竟也來了屡久?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤爱榔,失蹤者是張志新(化名)和其女友劉穎被环,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體详幽,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡筛欢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了唇聘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片版姑。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖迟郎,靈堂內(nèi)的尸體忽然破棺而出剥险,到底是詐尸還是另有隱情,我是刑警寧澤宪肖,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布表制,位于F島的核電站,受9級特大地震影響控乾,放射性物質(zhì)發(fā)生泄漏么介。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一蜕衡、第九天 我趴在偏房一處隱蔽的房頂上張望壤短。 院中可真熱鬧,春花似錦慨仿、人聲如沸鸽扁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽桶现。三九已至,卻和暖如春鼎姊,著一層夾襖步出監(jiān)牢的瞬間骡和,已是汗流浹背相赁。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留慰于,地道東北人钮科。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像婆赠,于是被迫代替她去往敵國和親绵脯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容