How to fix "peewee.InternalError: (1364, "Field 'id' doesn't have a default value")" when data is inserted

How to fix "peewee.InternalError: (1364, "Field 'id' doesn't have a default value")" when data is inserted

我正在通过 peewee 向 Heroku MySQL 数据库中插入一些数据

Place.create(day="1", time="20", place="1")

然后出现错误

peewee.InternalError: (1364, "Field 'id' doesn't have a default value")

我找到了一个答案,说我需要在 MySQL 中关闭严格模式,但它似乎没有用。我还尝试将 auto_increment 添加到 id,但看起来毫无意义,因为它已经具有 primary_key 值

这是一个酒吧预订应用程序,我想将用户模型和地点模型与预订模型连接起来。

class User(BaseModel):
    id = IntegerField(primary_key=True)
    username = CharField(unique=True)

class Place(BaseModel):
    id = IntegerField(primary_key=True)
    day = CharField()
    time = CharField()
    pl = CharField()

class Reservation(BaseModel):
    id = IntegerField(primary_key=True)
    u_id = ForeignKeyField(User, backref='reservs')
    p_id = ForeignKeyField(Place, backref='reservs')

这段代码将数据加载到 Place 中。最后一行给我错误。

for day in range(1,8):
    for time in range(18, 26, 2):
        for p in range(1, 9):
            Place.create(day=str(day), time=str(time), pl=str(p))

我已经成功地将它插入到本地的 SQLite 数据库中,但是它在 Heroku 中根本无法与 MySQL 一起使用

问题在于您没有为 id 分配任何值。由于 id 是主键,因此必须有一个值,并且您没有定义默认值以防您不提供它。您应该将代码更改为如下内容:

for day in range(1,8):
    for time in range(18, 26, 2):
        for p in range(1, 9):
            Place.create(id=id,day=str(day), time=str(time), pl=str(p))

您也可以将id列设置为自增,这样它会自动获取值

编辑

如果需要设置id,可以这样设置:

id=1
for day in range(1,8):
    for time in range(18, 26, 2):
        for p in range(1, 9):
            Place.create(id=id,day=str(day), time=str(time), pl=str(p))
            id=id+1

您应该使用 AutoField 而不是 IntegerField(primary_key=True)AutoField 当你想要自动递增的整数主键时应该使用。 IntegerField(primary_key=True) 意味着您显式指定了主键的整数值,这很少是您真正想要的。