我安装了postgresql - docker[postgres:9.6.24]并手动保存了表中的一些行,比如说,我添加了10行。
当我使用SQLAlchemy在表中插入新行时,得到了这个错误
sqlalchemy.exc.IntegrityError:(psycopg2.errors.UniqueViolation)重复键值违反唯一约束“bird_pkey”DETAIL:Key(bird_id)=(1)已存在。
密码-
session = self.Session()
bird_data = Bird(name='Parrot', population=50)
session.add(vehicle)
session.commit()
表─
class Bird(Base):
__tablename__ = 'bird'
bird_id = Column(Integer, primary_key=True)
name = Column(String)
population = Column(Integer)
但是,Bird
表中已经保存了10条记录。我不知道为什么主键显示唯一的约束错误,因为它通常是自动计算新记录的主键值。
如何解决这个问题
我尝试this answer,但我得到了语法错误
create sequence bird_seq increment 1 start 11;
SELECT nextval('bird_seq');
select setval('bird_seq', (select max(bird_id) from bird)+1);
但这也不起作用,我得到了同样的错误,但这次bird_id
被分配给2
sqlalchemy.exc.IntegrityError:(psycopg2.errors.UniqueViolation)重复键值违反唯一约束“bird_pkey”DETAIL:Key(bird_id)=(2)已存在。
如何解决这个问题?
这个表的主键没有正确分配,现在我想知道,这个问题会导致所有其他表在插入新记录时出错?如果是,如何解决数据库中所有表的此问题
谢谢
1条答案
按热度按时间rbpvctlc1#
你创建了一个表,然后手动插入数据,你说,然后可能没有定义主键。然后用SQLAlchemy定义表,它正确地完成了这项工作,并在列上插入了一个序列和主键标志。现在,当您尝试插入数据时,它会失败,因为SQLAlchemy主键序列从1开始,并且您已经拥有了具有此
bird_id
的行最简单的方法是清除您手动插入的数据。
如果出于某种原因不愿意这样做,那么需要找到SQLAlchemy创建的序列的名称,并将其递增。如果新序列不是与此表的主键关联的序列,则创建新序列并将其递增将不会产生任何效果。