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 | 存儲任意大的二進制數(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 從你的聲明中猜測了一個有用的默認值。 如果你想要一對一聯(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' (默認值)意味著 SQLAlchemy 會在使用一個標準 select 語句 時一氣呵成加載那些數(shù)據(jù).
- 'joined' 讓 SQLAlchemy 當(dāng)父級使用 JOIN 語句是,在相同的查詢中加 載關(guān)系。
- 'subquery' 類似 'joined' ,但是 SQLAlchemy 會使用子查詢。
- 在你有很多條目的時侯是特別有用的。 SQLAlchemy 會返回另一個查詢對象,你可以在加載這些條目時進一步提取。如果不僅想要關(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)系的輔助表。對于這個輔助表, 強烈建議不使用模型,而是采用一個實際的表:
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)表的表名。