You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Peewee bulk_create如何返回新增记录的ID?

解决Peewee bulk_create获取新增记录ID的问题

你遇到的问题其实是Peewee的bulk_create方法默认行为导致的——它默认不会返回创建后的模型实例,而是返回None,所以你遍历t才会触发NoneType错误。要拿到新增记录的ID,只需要调整调用参数就行,同时得注意不同数据库的支持情况:

核心方案:开启return_models=True参数

调用bulk_create时,添加return_models=True参数,方法就会返回创建完成的模型实例列表,其中已经自动填充了数据库生成的主键ID(前提是你的数据库支持批量插入后返回主键)。

示例代码:

from models import Table

# 构造数据:可以直接创建模型实例,或者从字典转换
data_list = [
    Table(field1="value1", field2="value2"),
    Table(**{"field1": "value3", "field2": "value4"})  # 字典转实例的写法
]

# 执行批量插入并返回实例
created_instances = Table.bulk_create(data_list, return_models=True)

# 遍历获取每个记录的ID
for instance in created_instances:
    print(instance.id)

不同数据库的兼容说明

  • PostgreSQL:完全支持批量插入返回主键,return_models=True可以直接拿到ID,无需额外操作。
  • MySQL:需要MySQL版本≥8.0.19,且表主键是自增(AUTO_INCREMENT)类型,同时使用官方MySQLDatabase驱动,此时也能正常返回ID。
  • SQLite:需要SQLite版本≥3.35.0(2021年发布),因为该版本才支持INSERT ... RETURNING语法;如果你的SQLite版本较低,这种方法可能失效,建议升级数据库版本。

补充:为什么create方法能直接拿ID?

create是单条插入操作,执行后会立即向数据库查询生成的主键并赋值给模型实例;而bulk_create为了追求批量插入的性能,默认跳过了这一步,所以需要显式开启return_models参数来触发主键的返回和赋值。

内容的提问来源于stack exchange,提问作者Mark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:34:04