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