python - 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()
我尝试了几种方法,例如Sequence
,autoincrement
等,但这些方法都不起作用。只有一种方法是在两个 commit() 之间添加以下代码:
db.connection().execute("select nextval('user_id_seq'::regclass"))
它会使代码变得混乱和丑陋,有没有更好的方法可以解决这个问题?sqlalchemy 中的原生方法是最理想的。
- Python3.6
- SQLAlchemy1.3
- PostgreSQL10
解决方案
不要将 分配id=1
给您的第一个User
实例。
只有调用user_id_seq
a时,数据库才会更新序列。nextval
如果id=1
手动指向,数据库中的序列仍将保持其初始值,因为 SQLA 不会调用nextval
以确定序列的下一个值。
要么删除id=1
,要么在您手动ALTER SEQUENCE user_id_seq RESTART WITH 2
放置后执行。id=1
推荐阅读
- r - 如何在 Shiny 中将数据表列标题向左对齐?
- excel - 如果单元格包含多个逗号分隔值的范围,则求和(来自另一个单元格)
- c# - 如何将 LoggerFactory 的实例传递给 ActionFilterAttribute
- android - 尝试在滑块中显示服务器图像时出现寻呼机适配器错误
- hsqldb - 更改 hsqldb 中的 varbinary 长度
- android - 在appWidget的Imageview中获取当前drawable
- java - RxJava 在一个对象中迭代列表并返回该对象
- javascript - 原型功能不再工作,出现未定义
- ethereum - 从另一个合约调用合约函数时出现以太坊交易错误
- html - 悬停时圆形裁剪到圆形边框