gpt4 book ai didi

python - SQLAlchemy:通过 ID 在多对多关系中添加一个 child

转载 作者:太空狗 更新时间:2023-10-30 01:34:11 33 4
gpt4 key购买 nike

我正在寻找一种方法来将“类别”子项添加到“对象”实体,而不会将性能浪费在首先加载子对象上。

“对象”和“类别”表以多对多的关系链接在一起,存储在“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 和每个类别除了单个批量 INSERT 命令之外,还需要我对数据库服务器执行单独的 SELECT 命令。在这种情况下完全不需要,因为我对操作给定的类别对象不感兴趣。基本上我所需要的只是很好地插入适当的类别 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 的强大功能执行此任务,但在数据库使用方面保持保守?

最佳答案

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

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

关于python - SQLAlchemy:通过 ID 在多对多关系中添加一个 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22913612/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com