我们为每个客户端都有一个专用的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);