在SQLAlchemy ORM tutorial中,它描述了大致如下创建对象关系的过程。让我假装我有一个表文章,一个表格关键词和一个表格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做到这一点,我必须从数据库中选择所有关键字,这似乎没有任何理由增加了很多开销。
有没有办法在不运行任何SQL来选择关键字的情况下创建此关系?
答案 0 :(得分: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'])
答案 1 :(得分:1)
Ants有正确的答案,但如果您将article_keywords明确地映射为关联对象,您只需创建新的ArticleKeyword对象并直接添加它们。