应用alembic迁移后,表序列ID不递增

时间:2018-02-10 06:32:39

标签: python postgresql flask alembic

我使用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没有递增?

提前致谢!

1 个答案:

答案 0 :(得分:2)

经过所有的研究和阅读后,我发现在postgres中它维护了一个单独的表来保存sequence_id,而不像它在表中处理的mysql。

因此,当您在python中应用迁移或fixture时,您需要在所有插入后增加或重置seq_id值。

像这样 -

op.execute(‘’'
       SELECT setval(‘“user_id_seq”‘, (SELECT max(“id”) from user));
   ‘’')