我使用alembic迁移面临一个奇怪的问题。我使用Postgres作为DB。
我编写了一个简化版本,我在表格中插入了一些数据(迁移前表格中已有一些数据)。
问题是迁移成功运行并将数据插入表中。但是在此之后,当我调用api并尝试插入新行时,我得到一些错误,因为表seq_id没有增加。
ERROR:__name__:Failed to create a duplicate entry: (psycopg2.IntegrityError) duplicate key value violates unique constraint "user_pkey"
DETAIL: Key (id)=(9) already exists.
[SQL: 'INSERT INTO user (id, name, age, number) VALUES (%(id)s, %(name)s, %(age)s, %(number)s) RETURNING id'] [parameters: {'number': None, 'id': 9, 'name': 'something', 'age': 12}]
让我们举个例子:
我有桌子"用户"已经有10行,现在使用alembic迁移我插入两行所以现在有12行。理想情况下,它也应该更新sequence_id,但seq_id仍然是10。
没有使用api我在更多行上插入它将尝试在id 11添加并将给出上述错误。如果我再尝试这个api两次就会成功,因为它每次都会增加seq_id。
只有在应用了alembic迁移后才会发生这种情况,否则它运行正常。
任何人都可以告诉我我做错了什么,我是否错过任何配置,为什么在应用迁移时序列ID没有递增?
提前致谢!
答案 0 :(得分:2)
经过所有的研究和阅读后,我发现在postgres中它维护了一个单独的表来保存sequence_id,而不像它在表中处理的mysql。
因此,当您在python中应用迁移或fixture时,您需要在所有插入后增加或重置seq_id值。
像这样 -
op.execute(‘’'
SELECT setval(‘“user_id_seq”‘, (SELECT max(“id”) from user));
‘’')