Postgres SQLAlchemy自动增量不起作用

amr*_*mrx 2 python postgresql sqlalchemy

我有一个模型类:

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

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

  id      | integer           | not null default nextval('users_id_seq'::regclass)
Run Code Online (Sandbox Code Playgroud)

如您所见,在修饰符列中生成默认序列.

但是当我尝试添加第二个用户时,我在主键约束上得到完整性错误.

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

这有什么不对?

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

  def create(name, email, roleid)

       with self._session_context() as session:
           user = User(name, email, roleid)
           session.add(user)
           session.commit()
Run Code Online (Sandbox Code Playgroud)

小智 6

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

SELECT setval('users_id_seq', MAX(id)) FROM users;
Run Code Online (Sandbox Code Playgroud)

  • 但自动增量应该适用于整数类型和主键组合。无论在交易发生的地方使用 setval 似乎都不是一个有效的解决方案。 (2认同)

amr*_*mrx 6

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