我正在尝试将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)
实际结果是,当它尝试插入时,由于没有外键将水果表的行告知苹果表而没有外键,因此在插入时出错了
期望插入时没有任何错误,并像插入两行时一样填充两个表
答案 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