sqlalchemy.exc.IntegrityError:重复的键值违反了唯一约束“user_pkey”

2024-03-29 13:29:10 发布

您现在位置:Python中文网/ 问答频道 /正文

以下是我的代码示例:

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中的本地方法是最理想的

  • Python3.6
  • SQLAlchemy1.3
  • PostgreSQL10

Tags: 方法代码namefromimportiddbbase
1条回答
网友
1楼 · 发布于 2024-03-29 13:29:10

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

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

手动放置id=1后,删除id=1,或执行ALTER SEQUENCE user_id_seq RESTART WITH 2

相关问题 更多 >