You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django迁移至Postgres后自增主键ID异常的问题咨询

问题原因

该报错是Postgres的自增序列值没有随导入的现有数据更新导致的:

IntegrityError at /admin/accounting/expense/add/
duplicate key value violates unique constraint "accounting_expense_pkey"
DETAIL: Key (id)=(2) already exists.

Django在Postgres中使用独立的*序列(sequence)*对象生成自增主键ID,从Sqlite迁移数据时仅导入了表记录,没有同步更新序列的当前计数,因此序列仍从1开始生成ID,和已有记录冲突。

自动重置序列的解决方案

Django内置了专门的工具可以自动识别所有表的当前最大主键值,批量更新对应序列的起始计数,无需手动计算每个表的ID最大值,完全符合你需要自动识别现有ID计数的需求:

  1. 执行Django自带的sqlsequencereset命令,替换尖括号内容为你的实际App名:
    python manage.py sqlsequencereset <your_app_name>
    本次报错涉及的是accounting App,执行命令为:
    python manage.py sqlsequencereset accounting
  2. 命令会输出对应的Postgres SQL语句,直接将这些语句在Postgres数据库客户端中执行即可。
    该命令会自动读取每个表当前最大的主键ID,将序列的下一个生成值设置为最大ID+1,完全匹配现有数据的ID计数。
全项目批量处理方案

如果需要一次性重置项目所有App的序列,可以直接在python manage.py shell中运行以下脚本:

from django.db import connection
from django.apps import apps

with connection.cursor() as cursor:
    for model in apps.get_models():
        table_name = model._meta.db_table
        pk_name = model._meta.pk.name
        cursor.execute(f"SELECT setval(pg_get_serial_sequence('{table_name}', '{pk_name}'), COALESCE(MAX({pk_name}), 1)) FROM {table_name}")

这段代码会自动遍历你项目中所有模型,批量更新所有对应表的序列值,空表会默认设置序列起始值为1。

内容的提问来源于stack exchange,提问作者Carlos Gonzalez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 21:54:03