在不选择的情况下插入关联对象的SQLAlchemy ORM
在SQLAlchemy ORM 教程中,大致描述了创建对象关系的过程。假设我有一个叫做 Articles 的表,一个叫做 Keywords 的表,还有一个叫做 Articles_Keywords 的表,这个表用来建立多对多的关系。
article = meta.Session.query(Article).filter(id=1).one()
keyword1 = meta.Session.query(Keyword).filter(id=1).one()
keyword2 = meta.Session.query(Keyword).filter(id=2).one()
article.keywords = [keyword1,keyword2]
meta.Session.commit()
我已经有了这些关键词的主键 ID 号码,所以我只需要把这些 ID 添加到 Articles_Keywords 表中,并且与这篇文章关联起来。问题是,使用 ORM 的话,我必须从数据库中选择所有的 Keywords,这样做似乎没有必要,却增加了很多额外的负担。
有没有办法在不运行任何 SQL 来选择关键词的情况下创建这种关系呢?
2 个回答
1
蚂蚁给出了正确的答案,不过如果你把文章关键词明确地映射成一个关联对象的话,你只需要创建新的 ArticleKeyword 对象,然后直接把它们添加进去就可以了。
3
很遗憾,ORM(对象关系映射)在没有查询数据库的情况下,无法保持对象状态的正确性。不过,你可以绕过ORM,直接往关联表里插入数据。假设Articles_Keywords是一个Table
对象:
meta.Session.execute(Articles_Keywords.delete(Articles_Keywords.c.article_id == 1))
meta.Session.execute(Articles_Keywords.insert(), [
{'article_id': 1, 'keyword_id': 1},
{'article_id': 1, 'keyword_id': 2},
])
如果你绕过ORM,已经加载的集合就不会更新,不能反映数据库中的变化。如果你需要刷新这个集合,可以调用Session.expire。这会导致下次访问时重新加载这个集合。
meta.Session.expire(article, ['keywords'])