为何AutoField定义id时调用create创建MySQL记录id为空?如何修复?
修复创建记录后
id字段为空的方案 这类问题基本都是ORM配置和数据库表结构不匹配导致的,按优先级排查即可解决:
- 优先核对MySQL侧
interactions表的实际结构
执行SQL语句SHOW CREATE TABLE interactions;检查id字段的配置是否符合要求:- 必须设置为
PRIMARY KEY主键 - 必须开启
AUTO_INCREMENT自增属性 - 字段类型要和ORM定义匹配(比如数据库用BIGINT存id,ORM就不能用映射INT的普通AutoField,要换成BigAutoField)
如果存在配置缺失,直接执行修改命令补齐:
-- 例如把未配置自增的id字段改成自增主键 ALTER TABLE interactions MODIFY COLUMN id INT AUTO_INCREMENT PRIMARY KEY; - 必须设置为
- 核对ORM模型的字段定义
你当前写的Interactions.create(name='Facebook')的调用逻辑是正确的,不需要手动传入id值。需要确认模型里的id字段是Peewee内置的AutoField类,而不是普通的IntegerField——如果把id定义成普通IntegerField,框架不会自动关联数据库的自增逻辑,插入时就不会自动回填id值。正确的模型定义参考:
另外要确认模型没有手动配置复合主键,一旦指定了其他字段作为联合主键,AutoField会失去默认主键的自增关联逻辑,同样会导致id值为空。from peewee import AutoField, TextField, BaseModel class Interactions(BaseModel): # 数据库id为普通INT自增用AutoField,为BIGINT自增就换成BigAutoField id = AutoField(column_name='id') name = TextField(column_name='name') class Meta: table_name = 'interactions' - 排除查询逻辑导致的“空值”误判
很多时候id字段本身是有值的,只是查询时拿到了旧的快照:插入记录后可以执行SELECT * FROM interactions ORDER BY id DESC LIMIT 1;查看最新插入的那条记录的id实际值,不要直接用未刷新的客户端查询结果判断id为空。另外要确认数据库连接开启了自动提交,未提交的事务插入的记录在外部查询时是不可见的,容易被误以为id为空。
正常配置完成后,执行
Interactions.create()插入的记录会自动生成连续的自增id,ORM也会把生成的id值回填到返回的模型实例上。
内容的提问来源于stack exchange,提问作者user13824551
相关产品推荐
相关产品推荐

