代码之家  ›  专栏  ›  技术社区  ›  Travis

SQLAlchemy ORM插入相关对象而不选择它们

  •  2
  • Travis  · 技术社区  · 16 年前

    SQLAlchemy ORM tutorial ,它大致描述了创建对象关系的过程,如下所示。让我们假设我有一个表Articles、一个表Keywords和一个表Articles\u 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 回复  |  直到 16 年前
        1
  •  3
  •   Ants Aasma    16 年前

    不幸的是,ORM无法在不查询数据库的情况下保持对象状态正常。但是,您可以轻松地绕过ORM并插入到关联表中。假设Articles_关键字是 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,则不会更新已加载的集合以反映数据库中的更改。如果需要刷新集合呼叫会话,请在该会话上过期。这将导致下次访问集合时重新加载该集合。

    meta.Session.expire(article, ['keywords'])
    
        2
  •  1
  •   zzzeek    16 年前