1、一个非常简单的例子
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
email = db.Column(db.String(120), unique=True)
def __init__(self, username, email):
self.username = username
self.email = email
def __repr__(self):
return '<User %r>' % self.username
2、一对多关系
# 一
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'))
addresses = db.relationship('Address', backref='person',lazy='dynamic')
relationship函数:sqlalchemy对关系之间提供的一种便利的调用方式,关联不同的表;
backref参数:对关系提供反向引用的声明,在Address类上声明新属性的简单方法,之后可以在my_address.person来获取这个地址的person;
lazy参数:决定了 SQLAlchemy 什么时候从数据库中加载数据,有四个可选方式:'select','joined','subquery','dynamic':
- 'select'(默认值):SQLAlchemy 会在使用一个标准 select 语句时一次性加载数据;
- 'joined':让 SQLAlchemy 当父级使用 JOIN 语句是,在相同的查询中加载关系;
- 'subquery':类似 'joined' ,但是 SQLAlchemy 会使用子查询;
- 'dynamic':SQLAlchemy 会返回一个查询对象,在加载这些条目时才进行加载数据,大批量数据查询处理时推荐使用。
person_id = db.Column(db.Integer, db.ForeignKey('person.id'))
ForeignKey参数:代表一种关联字段,将两张表进行关联的方式,表示一个person的外键,设定上必须要能在父表中找到对应的id值。
3、一对一关系
class Parent(Base):
id = Column(Integer, primary_key=True)
child_id = Column(Integer, ForeignKey('child.id'))
child = relationship("Child", backref=backref("parent", uselist=False))
class Child(Base):
id = Column(Integer, primary_key=True)
parent_id = Column(Integer, ForeignKey('parent.id'))
在一对多关系基础上的父表中使用backref函数,并添加uselist参数来表示一对一关系。
4、多对多关系
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)
如果想要用多对多关系,需要在两个类之间增加一个关联的辅助表。
tags = db.relationship('Tag', secondary=tags, backref=db.backref('pages', lazy='dynamic'))
secondary参数:指定多对多关系中关系表的名字;
backref函数:由于在这里我们需要在每一页显示多个标签,所以使用backref参数添加一个反向引用,配置 Page.tags 加载后作为标签的列表。