【问题标题】:Postgres SQLAlchemy auto increment not workingPostgres SQLAlchemy自动增量不起作用
【发布时间】:2017-03-09 21:00:14
【问题描述】:

我有一个模型类:

class User(PBase):
   __tablename__ = "users"
   id = Column(Integer, primary_key=True)
   name = Column(String, nullable=False, unique=True)

现在根据文档,当 Integer 类型与 primary_key 一起使用时,会自动生成一个序列。这是输出表

  id      | integer           | not null default nextval('users_id_seq'::regclass)

如您所见,在修饰符列中生成了一个默认序列。

但是当我尝试添加第二个用户时,主键约束出现完整性错误。

IntegrityError) duplicate key value violates unique constraint   "users_pkey"
DETAIL:  Key (id)=(1) already exists. 

这里有什么问题?

编辑:添加用户的代码,快照

  def create(name, email, roleid)

       with self._session_context() as session:
           user = User(name, email, roleid)
           session.add(user)
           session.commit()

【问题讨论】:

  • 您是否在正确的时间提交事务?

标签: python postgresql sqlalchemy


【解决方案1】:

所以,想出并在这里回答,所以它可以帮助其他人。因此,对于 Postgres,如果您在插入新记录时碰巧提供了 id 字段,则不会使用表的顺序。如果您不指定 id,则在进一步插入时,不使用序列表,因此您有重复。在我的应用程序中,从 JSON 文件默认加载的几条记录和为这些记录指定了 id 的记录,但对于所有非默认值,在插入期间没有提供 id。 This helped me

【讨论】:

  • 不错的收获!以下是基于您的链接的python-sql解决方案:db.engine.execute("SELECT setval('{0}_id_seq', max(id)+1) FROM fund_moment;".format(table_name))
【解决方案2】:

可以通过在您的数据库上发出以下查询来解决。

SELECT setval('users_id_seq', MAX(id)) FROM users;

【讨论】:

  • 但是自动增量应该适用于整数类型和主键组合。在交易发生的任何地方使用 setval 似乎都不是一个有效的解决方案。
  • 这里patricus给出的解释可以帮助你理解[stackoverflow.com/questions/37970743/…
  • 谢谢。我手动插入了一些带有 id 的记录。那是个错误。
猜你喜欢
  • 2021-10-29
  • 2022-01-25
  • 2015-11-22
  • 2013-05-25
  • 2023-03-21
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
相关资源
最近更新 更多