【问题标题】:SQLAlchemy: add a child in many-to-many relationship by IDsSQLAlchemy:通过ID添加一个多对多关系的孩子
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 对不起,您的答案正是在我将这种方法添加到我的帖子中时出现的。感觉就像错过了正确使用 SQLAlchemy 的一些不错的关系功能的机会。此外,它生成一系列 INSERT,而不是单个批量 INSERT。
    • 考虑不要担心性能(至少在你发现问题之前不要担心)。可能是您在这里过早地进行了优化?
    • 我已经经历了足够多的严重过度使用数据库的项目,因此请谨慎接受您“不要担心”的建议。在这种特殊情况下,您是对的,成本可能过于疏忽,无法证明数小时的研究和编码是合理的。但是由于我对 SQLAlchemy 还比较陌生,并且我计划在大型项目中使用它,所以我想了解它的工作原理并有效地使用它,而不是在地毯下扫过 DB 层编码,然后想知道为什么会这样变慢。
    • 好点。在 SQLAlchemy 中,性能的关键通常是知道如何使用各种急切加载技术来处理关系。并且重要的是要跟踪执行了多少/什么查询。例如,在 Web 应用程序中,使用某种“调试工具栏”来显示每个请求的查询。
    • 没错。这又回到了我的问题——SQLAlchemy 中是否有一种方法可以懒惰地使用其主键来实例化一个对象,以便框架可以执行子附加,而无需费心从数据库中加载对象?当然,因此开发人员接管了验证此类 id 是否确实存在于数据库中的担忧。
    猜你喜欢
    • 2012-02-08
    • 2014-03-12
    • 1970-01-01
    • 2021-08-14
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    相关资源
    最近更新 更多