【发布时间】:2014-05-19 18:23:49
【问题描述】:
我正在寻找一种将“类别”子对象添加到“对象”实体的方法,而不会浪费首先加载子对象的性能。
“Object”和“Category”表以多对多关系链接,存储在“ObjectCategory”表中。 “对象”模型由关系提供:
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 和每个类别会花费我一个单独的 SELECT 命令到 db 服务器,除了单个批量 INSERT 命令。在这种情况下完全不需要,因为我对操作给定的类别对象不感兴趣。基本上我所需要的只是很好地插入适当的类别 ID。
最明显的解决方案是直接在关联表中插入条目:
db.session.add(models.ObjectCategory(oct_objID=9, oct_catID=22))
db.session.add(models.ObjectCategory(oct_objID=9, oct_catID=28))
但是这种方法有点丑,它似乎没有使用抽象的 SQLAlchemy 关系的力量。更重要的是,它为每个 add() 生成单独的 INSERT,而不是像 obj.categories.extend([list]) 情况下的漂亮的批量 INSERT。我想可能有一些惰性对象模式可以让对象只使用它的 ID(未验证)并仅在请求时加载其他字段。这将允许在一对多或多对多关系中添加子节点,而无需向数据库发出任何 SELECT,但仍允许使用强大的 ORM 抽象(即,将子节点列表视为 Python 列表)。
我应该如何调整我的代码以使用 SQLAlchemy 的强大功能执行此任务,但在数据库使用方面要保守?
【问题讨论】:
标签: python orm sqlalchemy