Python 炼金术中的数据库模型与数据库表

Python 炼金术中的数据库模型与数据库表,python,sqlalchemy,flask-sqlalchemy,Python,Sqlalchemy,Flask Sqlalchemy,他们说多对多查找表不应该是db.Model的子类,而应该写成db.tables。从文档中: 如果要使用多对多关系,则需要定义 用于关系的辅助表。对于这个助手 表强烈建议不要使用模型,而应使用实际模型 桌子 为什么??让一切都成为模型的缺点是什么?我认为在数据库中使用统一的表声明方式看起来更干净。此外,开发人员可能会在稍后的某个时候希望直接访问这些映射记录,而不是通过需要模型的关系来访问这些映射记录。db.Table更简单。 当您通过db.Table定义多对多关系时,SQLAlchemy将接管并为

他们说多对多查找表不应该是db.Model的子类,而应该写成db.tables。从文档中:

如果要使用多对多关系,则需要定义 用于关系的辅助表。对于这个助手 表强烈建议不要使用模型,而应使用实际模型 桌子


为什么??让一切都成为模型的缺点是什么?我认为在数据库中使用统一的表声明方式看起来更干净。此外,开发人员可能会在稍后的某个时候希望直接访问这些映射记录,而不是通过需要模型的关系来访问这些映射记录。

db.Table更简单。

当您通过
db.Table
定义多对多关系时,SQLAlchemy将接管并为您完成大部分工作

因此,假设我们与具有以下
模型
定义的帖子和标签有关系:

表:

tagging = db.Table('tagging',
    db.Column('post_id', db.Integer, db.ForeignKey('post.id')),
    db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'))
)
型号:

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)
插入和删除 如中所述:

relationship()的第二个参数所特有的一种行为是,在集合中添加或删除对象时,此处指定的表会自动执行INSERT和DELETE语句。无需手动从此表中删除。从集合中删除记录的行为将产生刷新时删除行的效果

使用
db.Table
,您可以执行以下操作:

>>> post.tags.append(tag_foo)
>>> db.session.commit()
>>> tagging = post.tags.filter_by(post_id=post.id).first()
>>> db.session.delete(tagging)
>>> db.session.commit()
您无需将其添加到会话中,然后可以删除与
remove()
的关系:

但是,如果使用
db.Model
,则必须执行类似操作(
Tagging
是模型类):

然后像这样删除它:

>>> post.tags.append(tag_foo)
>>> db.session.commit()
>>> tagging = post.tags.filter_by(post_id=post.id).first()
>>> db.session.delete(tagging)
>>> db.session.commit()
查询 使用
db.表

>>> post.tags.all()
>>> [<Tag 'foo'>, ...]

总之,如果您不需要存储有关关系的额外数据,只需使用
db.Table
,它将节省您的时间。

如果您确实需要存储有关关系的额外数据,该怎么办?然后使用
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'>