python - 如何批量插入 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)
实际结果是,当它尝试插入时,由于它没有将水果表的行告诉苹果表的外主键,因此在插入时出错
期望插入没有任何错误并填充两个表,就像插入两行时一样
解决方案
我想通了,所以 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
推荐阅读
- angular - ngSwitch 未更改为表达式条件
- azure - Azure Active Directory 用户搜索优化
- java - java - 如何在java eclipse中的同一行中显示计时器的文本
- r - 如何将r中的两个字符向量组合成一个新的向量?
- php - 如何构建具有(只有一页(SPA)和其他普通 PHP 页面的 Angular 应用程序?
- jquery - Jquery:如何使用所需的特定 ID 进行选择
- python-3.x - 在 jupyter-notebook for windows (python3) 中应用输入的语法如何?
- c++ - 当没有括号丢失时,输入末尾应为“}”
- java - 无法点击“ul”和“li”下的“DRIVE”元素
- python - pandas - 列出用于计算滚动的数据?