以下是我的代码示例:
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中的本地方法是最理想的
不要将
id=1
分配给第一个User
实例如果调用
nextval
,DB将只更新序列user_id_seq
。 如果手动指向id=1
,数据库中的序列仍将保持其初始值,因为SQLA不会调用nextval
来确定序列的下一个值手动放置
id=1
后,删除id=1
,或执行ALTER SEQUENCE user_id_seq RESTART WITH 2
相关问题 更多 >
编程相关推荐