首页 > 解决方案 > sqlalchemy.exc.IntegrityError:重复键值违反唯一约束“user_pkey”

问题描述

这是我的代码示例:

from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine(MY_DB_URI, echo=False)
Session = sessionmaker(bind=engine)

Base = declarative_base()


class User(Base):
    __tablename__ = 'user'

    id = Column(Integer, primary_key=True)
    name = Column(String)


Base.metadata.drop_all(engine)
Base.metadata.create_all(engine)

db = Session()
db.add(User(id=1, name='one'))
db.commit()

db.add(User(name='two'))

# Here will raise exception:
# sqlalchemy.exc.IntegrityError: (psycopg2.errors.UniqueViolation)
# duplicate key value violates unique constraint "user_pkey"
# DETAIL:  Key (id)=(1) already exists.
db.commit() 

我尝试了几种方法,例如Sequenceautoincrement等,但这些方法都不起作用。只有一种方法是在两个 commit() 之间添加以下代码:

db.connection().execute("select nextval('user_id_seq'::regclass"))

它会使代码变得混乱和丑陋,有没有更好的方法可以解决这个问题?sqlalchemy 中的原生方法是最理想的。

标签: pythonpostgresqlsqlalchemy

解决方案


不要将 分配id=1给您的第一个User实例。

只有调用user_id_seqa时,数据库才会更新序列。nextval如果id=1手动指向,数据库中的序列仍将保持其初始值,因为 SQLA 不会调用nextval以确定序列的下一个值。

要么删除id=1,要么在您手动ALTER SEQUENCE user_id_seq RESTART WITH 2放置后执行。id=1


推荐阅读