如何批量插入SQLAlchemy子类(联合继承)

2024-05-29 11:14:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将SQL Alchemy子类批量插入父表和它们各自的表,即fruits表->;Apple表,因此我插入一个Apple表,它将两行都插入fruits表,然后给我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)

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

希望插入时不会出现任何错误,并像插入两行一样填充两个表


Tags: 数据idappledbdatasessiontype批量
1条回答
网友
1楼 · 发布于 2024-05-29 11:14:07

我发现SQLALCHEMY在批量插入映射中有一个名为return\u defaults的参数

警告这是直接从docs返回默认值–如果为True,将一次插入一行缺少生成默认值的值,即整数主键默认值和序列,以便主键值可用。特别是,这将允许正确插入联接继承和其他多表映射,而无需提前提供主键值;但是,Session.bulk\u插入\u映射.return\u默认值大大降低了整个方法的性能增益。如果要插入的行仅引用一个表,则没有理由设置此标志,因为未使用返回的默认信息。你知道吗

所以你要做的就是

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

它仍然比db.session.add快很多

相关问题 更多 >

    热门问题