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 | 整数 |
String(size) | 有最大长度的字符串 |
Text | 长unicode文本 |
DateTime | 表示datetime对象的时间和日期 |
Float | 存储浮点值 |
Boolean | 存储布尔值 |
PickleType | 存储一个持久化python对象 |
LargeBinary | 存储任意大的二进制数据 |
One-to-Many Relationships
最常用的关系就是一对多关系。因为关系在它们建立之前就已经声明,你可以使用 字符串来参考还没有创建的类(比如如果 Person 定义了一个到 Address 的 关系,而这个关系在文件的后面才会声明)。
关系用函数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() 做了什么?这个函数返回一个可以做许多事情的属性。 在本案例中,我们让它指向 Address 类并加载那些中的多个。它如何知道这 会返回至少一个地址?因为 SQLALchemy 从你的声明中猜测了一个有用的默认值。 如果你想要一对一联系,你可以把 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 什么时候从数据库中加载数据:
- 'select' (默认值)意味着 SQLAlchemy 会在使用一个标准 select 语句 时一气呵成加载那些数据.
- 'joined' 让 SQLAlchemy 当父级使用 JOIN 语句是,在相同的查询中加 载关系。
- 'subquery' 类似 'joined' ,但是 SQLAlchemy 会使用子查询。
- 在你有很多条目的时侯是特别有用的。 SQLAlchemy 会返回另一个查询对象,你可以在加载这些条目时进一步提取。如果不仅想要关系下的少量条目 时,这通常是你想要的。
你如何为反向引用(backrefs)定义惰性(lazy)状态?使用backref()函数:
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
如果你想要用多对多关系,你需要定义一个用于关系的辅助表。对于这个辅助表, 强烈建议不使用模型,而是采用一个实际的表:
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参数,其值为关联表的表名。