我有一个模型类:
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()
答案 0 :(得分:5)
所以,想出来并在这里回答,所以它可以帮助别人。因此,如果您在插入新记录时碰巧提供了id字段,那么使用Postgres时,不会使用表的序列。如果您没有指定id,则在进一步插入时,不使用序列表,因此您有重复。在我的应用程序中,几个记录从JSON文件加载了默认值并为这些记录指定了id,但是对于所有非默认值,在插入期间没有提供id。 This helped me
答案 1 :(得分:1)
可以通过在数据库上发出以下查询来解决此问题。
SELECT setval('users_id_seq', MAX(id)) FROM users;