Peewee 和 raw SQL 创建语句

Peewee and raw SQL create statements

我们为每个客户端都有一个专用的 Postgres 数据库,因为我们无法在不发疯的情况下为每个客户端处理数据库迁移,因此我们使用原始 SQL 文件。我们有一个初始 SQL 文件,它创建 table 并插入一些数据。在我们尝试插入 table 之前出现问题,该 table 之前使用 INSERT INTO 句子填充了初始 SQL 脚本。

不知何故,peewee 想要使用 ID=1 创建新记录,从而引发 IntegrityrError(我们从 SQL 文件创建了一堆)。我不太确定如何处理这种情况。

我有一个基础模型:

class BaseModel(peewee.Model):
    active = peewee.BooleanField(default=True)
    created_at = peewee.DateTimeField(default=datetime.datetime.now)
    updated_at = peewee.DateTimeField(null=True)

    class Meta:
        database = database

使用 BaseModel 的示例模型:

class UserRole(BaseModel):
    user = peewee.ForeignKeyField(User)
    role = peewee.ForeignKeyField(Role)

    class Meta:
        indexes = (
            (('user', 'role'), True),
        )

假设 UserRole 有来自初始 SQL 脚本的五个记录。如果尝试使用 Flask 应用程序中的 UserRole.create 创建新记录,则会收到关于 ID=1 的完整性错误。

有什么想法吗?

在插入新数据之前,您需要修复为您提供 ID 值的序列。 Here 是一个如何做到这一点的例子。在你这样做之后,尽量避免在你的插入查询中使用显式 id,允许 db 为你分配 id 值

似乎在数据库中,table 没有正确引用 auto_increment 的序列。例如,如果 table 的列 'id' 具有序列的下一个值的默认值,则序列设置为正确的值。这是一个例子:

CREATE SEQUENCE user_id_seq;
ALTER TABLE user ALTER user_id SET DEFAULT NEXTVAL('user_id_seq');
select max(id) from user; -- returns 21
SELECT setval('payments_id_seq', 22, true);