【问题标题】:Peewee and raw SQL create statementsPeewee 和原始 SQL 创建语句
【发布时间】:2020-05-27 23:01:27
【问题描述】:

我们为每个客户端都有一个专用的 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 脚本的 5 条记录。如果尝试使用烧瓶应用程序中的UserRole.create 创建新记录,则会收到关于 ID=1 的完整性错误。

有什么想法吗?

【问题讨论】:

  • 我确定我无法回答这个问题。但它可能有助于未来的访问者实际拥有 1.您正在使用的完整 UserRole.create 命令的代码,这会导致错误和 2.实际的错误消息和可能指向堆栈跟踪的 gist 链接以及 3 . 你传递给 UserRole.create 的是什么,你传递的这些值的“类型”是什么

标签: python postgresql flask peewee


【解决方案1】:

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

【讨论】:

  • 您还需要确保主键序列归正确的用户所有。
  • 谢谢!在每次从 SQL 文件插入之后,我必须使用最后一个 ID 运行 setval()
【解决方案2】:

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

【讨论】:

  • 是的,setval() 是解决方案。谢谢!
猜你喜欢
  • 1970-01-01
  • 2010-11-08
  • 2021-11-04
  • 2017-03-22
  • 2023-01-17
  • 2012-08-06
  • 2019-06-29
  • 1970-01-01
  • 2021-12-05
相关资源
最近更新 更多