Peewee 和原始 SQL 创建语句



我们为每个客户端都有一个专用的Postgres数据库,因为我们无法处理每个客户端的数据库迁移而不发疯,所以我们使用原始SQL文件。我们有一个初始 SQL 文件,用于创建表并插入一些数据。在我们尝试插入到以前使用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 脚本的五条记录。如果尝试使用烧瓶应用程序中的UserRole.create创建新记录,则我会收到有关 ID=1 的完整性错误。

有什么想法吗?

在插入新数据之前,您需要修复提供 id 值的序列。下面是如何执行此操作的示例。执行此操作后,请尽量避免在插入查询中使用显式 id,允许 db 为您分配 id 值

似乎在数据库中,表没有正确引用auto_increment序列。例如,如果表有一个列"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);

最新更新