SQLAlchemy:按ID添加多对多关系中的子项

时间:2014-04-07 13:16:40

标签: python orm sqlalchemy

我正在寻找一种方法来添加"类别"孩子到"对象"实体首先没有浪费性能加载子对象。

"对象"和"类别"表与多对多关系链接,存储在" ObjectCategory"表。 "对象" model随附了关键字:

categories = relationship('Category', secondary = 'ObjectCategory', backref = 'objects')

现在这段代码运行得很好:

obj = models.Object.query.get(9)
cat1 = models.Category.query.get(22)
cat2 = models.Category.query.get(28)
obj.categories.extend([cat1, cat2])

但是在调试输出中,我看到实例化obj,除了单个批量INSERT命令之外,每个类别都要花费我一个单独的SELECT命令到db服务器。在这种情况下完全不需要,因为我对操纵给定的类别对象不感兴趣。基本上我只需要很好地插入适当的类别ID。

最明显的解决方案是继续直接在关联表中插入条目:

db.session.add(models.ObjectCategory(oct_objID=9, oct_catID=22))
db.session.add(models.ObjectCategory(oct_objID=9, oct_catID=28))

但是这种方法有点难看,它似乎并没有使用抽象的SQLAlchemy关系的强大功能。除了obj.categories.extend([list])这样的情况之外,它还为每个add()生成单独的INSERT,而不是很好的批量INSERT。我想可能有一些懒惰的对象模式会让对象只使用它的ID(未经验证)并仅在请求时加载其他字段。这将允许在一对多或多对多关系中添加子项而不向数据库发出任何SELECT,但允许使用强大的ORM抽象(即将子列表视为Python列表)。

如何使用SQLAlchemy的强大功能调整我的代码来执行此任务,但是对数据库的使用是否保守?

1 个答案:

答案 0 :(得分:1)

您是否有ObjectCategory表的ORM映射?如果是这样,您可以创建和添加ObjectCategory对象:

session.add(ObjectCategory(obj_id=9, category_id=22)
session.add(ObjectCategory(obj_id=9, category_id=28)