如何批量插入sqlalchemy子类

时间:2019-07-18 12:31:32

标签: python sqlalchemy

我正在尝试将SQL-Alchemy子类批量插入父表及其各自的表(例如,水果表-> Apple Table)中,因此我插入了一个APPLE表,它将两行都插入到水果表中,然后给我水果表中该行的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)

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

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

1 个答案:

答案 0 :(得分:0)

我知道了,所以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

快很多