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)表的表名。