SQLAlchemy ORM在不选择它们的情况下插入相关对象

时间:2010-02-01 22:24:10

标签: python performance orm sqlalchemy

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来选择关键字的情况下创建此关系?

2 个答案:

答案 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对象并直接添加它们。