首页 > 解决方案 > 如何批量插入 SQLAlchemy 子类(联合继承)

问题描述

我正在尝试将 SQL-Alchemy 子类批量插入父表及其各自的表,即水果表 - > Apple 表,所以我插入了一个 APPLE 表,它会将这两行都插入到 fruits 表中,然后给我 id水果表中的行并将其放入 Apple 这在一次插入一行时有效,但由于性能原因,我需要它与批量插入一起使用

我尝试批量插入失败,我尝试了单行插入,它适用于单行插入,但问题是除了自动生成的行的 id 之外,这些数据并不是真正唯一的,所以它真的很难对父表进行批量插入,然后对数据匹配的子类表进行批量插入,并通过映射函数使用 id

            for data in apple_list:
                db.session.add(Apple(
                    brand=data["brand"],
                    picked_date=data["picked_date"],
                    type=data["type"],
                    color=data["color"],
                    sub_type=data["sub_type"],
                ))

我想要的是更像批量插入的东西

          db.session.bulk_insert_mappings(model_classes['Apple'], apple_list)

实际结果是,当它尝试插入时,由于它没有将水果表的行告诉苹果表的外主键,因此在插入时出错

期望插入没有任何错误并填充两个表,就像插入两行时一样

标签: pythonsqlalchemy

解决方案


我想通了,所以 SQLALCHEMY 在批量插入映射中有一个参数,称为return_defaults

警告这直接来自文档return_defaults - 当为 True 时,缺少生成默认值的值的行,即整数主键默认值和序列,将一次插入一个,以便主键值可用。特别是这将允许连接继承和其他多表映射正确插入,而无需提前提供主键值;但是, Session.bulk_insert_mappings.return_defaults 大大降低了该方法的整体性能增益。如果要插入的行仅引用单个表,则没有理由设置此标志,因为不使用返回的默认信息。

那么你所要做的就是这个

db.session.bulk_insert_mappings(model_classes['Apple'], apple_list, return_defaults=True) 

它仍然比db.session.add


推荐阅读