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 整数
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参数,其值为关联表的表名。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容