Mat*_*vis 6 python sqlalchemy flask-sqlalchemy
该瓶-SQLAlchemy的文档说,许多一对多查找表不应该继承db.Model而是被写成db.Tables。从文档:
如果要使用多对多关系,则需要定义用于该关系的帮助程序表。对于此辅助表,强烈建议不要使用模型,而是使用实际表
为什么?将所有内容制作为模型有哪些弊端?我认为采用统一的方式在数据库中声明表看起来更干净。同样,有可能以后某个时间,开发人员将需要直接访问那些映射记录,而不是通过需要模型的关系来访问。
该db.Table更简单。
当您通过定义多对多关系时db.Table,SQLAlchemy将接手并为您完成大部分工作。
因此,假设我们与带有以下内容Table和Model定义的帖子和标签有关系:
表:
tagging = db.Table('tagging',
db.Column('post_id', db.Integer, db.ForeignKey('post.id')),
db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'))
)
Run Code Online (Sandbox Code Playgroud)
模型:
class Tagging(db.Model):
tag_id = db.Column(db.Integer, db.ForeignKey('tag.id'),
primary_key=True)
post_id = db.Column(db.Integer, db.ForeignKey('post.id'),
primary_key=True)
Run Code Online (Sandbox Code Playgroud)
如文档中的描述:
对Relationship()的辅助参数唯一的行为是,在对象中添加或从集合中删除时,此处指定的Table会自动受到INSERT和DELETE语句的约束。无需手动从该表中删除。从集合中删除记录的行为将具有刷新行时删除该行的作用。
使用db.Table,您可以执行以下操作:
>>> post.tags.append(tag_foo)
>>> db.session.commit()
Run Code Online (Sandbox Code Playgroud)
您无需将其添加到会话中,则可以使用删除关系remove():
>>> post.tags.remove(tag_foo)
>>> db.session.commit()
Run Code Online (Sandbox Code Playgroud)
但是,如果使用db.Model,则必须执行以下操作(Tagging是Model类):
>>> tagging = Tagging(post=post_foo, tag=tag_bar)
>>> db.session.add(tagging)
>>> db.session.commit()
Run Code Online (Sandbox Code Playgroud)
然后像这样删除它:
>>> tagging = post.tags.filter_by(post_id=post.id).first()
>>> db.session.delete(tagging)
>>> db.session.commit()
Run Code Online (Sandbox Code Playgroud)
与db.Table:
>>> post.tags.all()
>>> [<Tag 'foo'>, ...]
Run Code Online (Sandbox Code Playgroud)
然后db.Model:
>>> post.tags.all() # You only get Tagging item.
>>> [<Tagging 'post_foo -- tag_bar'>, ...]
>>> for tagging in post.tags:
>>> print tagging.tag # <Tag 'foo'>
Run Code Online (Sandbox Code Playgroud)
简而言之,如果您不需要存储有关该关系的额外数据,只需使用db.Table,它将节省您的时间。
| 归档时间: |
|
| 查看次数: |
4776 次 |
| 最近记录: |