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
相关产品推荐
相关产品推荐

