自定义IntegerField主键无法保存数据求助(Peewee 3.9.2)
解决Peewee自定义主键无法保存数据的问题
我之前也碰到过一模一样的情况,手动指定自定义主键值后调用save()就会触发这个语法错误,其实问题出在Peeweesave()方法的默认逻辑上。
先还原你的代码场景:
from peewee import * db = SqliteDatabase(r'peewee.db') class BaseModel(Model): class Meta: database=db class Case(BaseModel): cid=IntegerField(primary_key=True) db.create_tables([Case,]) c1=Case(cid=1) c1.save()
触发的核心报错是:
peewee.OperationalError: near "WHERE": syntax error
问题原因
Peewee的save()方法会自动判断执行插入还是更新操作:当实例的主键有值时,它默认认为这条记录已经存在,会尝试生成UPDATE语句更新数据。但你的Case模型只有主键字段,没有其他需要更新的字段,最终生成的SQL会变成这种错误格式:
UPDATE "case" SET WHERE "cid" = ?
SET后没有任何字段,直接跟WHERE就导致了语法错误。
两种可行的解决方法
方法一:用create()直接插入新记录
create()方法会直接生成INSERT语句,跳过更新判断逻辑,非常适合创建新记录:
# 替换原有的实例创建+save()步骤 Case.create(cid=1)
方法二:调用save()时强制指定插入操作
如果一定要用save()方法,可以通过参数强制让它执行插入,跳过更新检查:
c1=Case(cid=1) c1.save(force_insert=True)
这两种方式都能正常插入带自定义主键值的记录。
内容的提问来源于stack exchange,提问作者pcell
相关产品推荐
相关产品推荐

