Django Import-Export Import Duplicate key value violates 错误
Django Import-Export Import Duplicate key value violates Error
我正在开发一个项目,使用 Django 1.10、Python 3.6 和 PostgreSQL 作为数据库后端,其中我有一个名为“文章”的模型,我需要从 CSV 文件导入数据。我已成功导入我的第一个 CSV 文件,其中包含以下字段:
编号,link & 类别
它的 ID 字段从 1 到 1960
然后在下一个文件中,我从 1961 年开始开始 ID 字段,但它显示以下错误:
Line number: 1961 - duplicate key value violates unique constraint "article_article_pkey" DETAIL: Key (id)=(1961) already exists.
即使我在 Django 管理中看到我的文章模型,它也会显示 1-1960 年的 ID
这是我的 models.py:
class Article(models.Model):
id = models.AutoField(primary_key=True)
link = models.URLField(max_length=255)
category = models.CharField(max_length=255, choices=Categories)
这里是admin.py
@admin.register(Article)
class ArticleAdmin(ImportExportModelAdmin):
resource_class = views.ArticleResource
readonly_fields = ('id',)
我已经触发了问题是什么:
实际上,问题是 PostgreSQL 主键顺序未与 table 行同步。
这就是为什么当我插入新行时出现重复键错误,因为串行数据类型中隐含的序列 returns 已经存在的数字。
为了解决这个问题,我们必须为 PostgreSQL 重置 ID 顺序,
这是分步指南:
- 登录数据库 shell 并连接到您的数据库
- 首先,检查 table 的 id 列的最大值为
SELECT MAX(id) FROM your_table;
- 然后,检查 ID 的下一个值是什么:
SELECT nextval('your_table_id_seq');
- 如果nextval是下一个Max值的数字就对了。 例如 MAX=10 & nextval=11
否则将 table 的 id_seq 重置为:
BEGIN;
-- 在更新计数器时防止并发插入
LOCK TABLE your_table IN EXCLUSIVE MODE;
--更新序列
SELECT setval('your_table_id_seq', COALESCE((SELECT MAX(id)+1 FROM your_table), 1), false);
COMMIT;
我遇到了这个问题,因为我指定了自定义 import_id_fields
字段但没有排除 id
字段。
我指定了:
import_id_fields = ('code',)
skip_unchanged = True
report_skipped = True
但我需要:
import_id_fields = ('code',)
skip_unchanged = True
report_skipped = True
exclude = ('id',)
有点菜鸟错误,但这可能会为某人节省 google。
参考:https://github.com/django-import-export/django-import-export/issues/273
我经常 运行 for 循环。这也会更新我的自动日期时间字段:
import Article
for i in range(1, your_last_id + 1):
item = Article.objects.get(id=i)
item.save()
your_last_id 可能是 SELECT MAX(id)
我正在开发一个项目,使用 Django 1.10、Python 3.6 和 PostgreSQL 作为数据库后端,其中我有一个名为“文章”的模型,我需要从 CSV 文件导入数据。我已成功导入我的第一个 CSV 文件,其中包含以下字段: 编号,link & 类别 它的 ID 字段从 1 到 1960 然后在下一个文件中,我从 1961 年开始开始 ID 字段,但它显示以下错误:
Line number: 1961 - duplicate key value violates unique constraint "article_article_pkey" DETAIL: Key (id)=(1961) already exists.
即使我在 Django 管理中看到我的文章模型,它也会显示 1-1960 年的 ID
这是我的 models.py:
class Article(models.Model):
id = models.AutoField(primary_key=True)
link = models.URLField(max_length=255)
category = models.CharField(max_length=255, choices=Categories)
这里是admin.py
@admin.register(Article)
class ArticleAdmin(ImportExportModelAdmin):
resource_class = views.ArticleResource
readonly_fields = ('id',)
我已经触发了问题是什么: 实际上,问题是 PostgreSQL 主键顺序未与 table 行同步。 这就是为什么当我插入新行时出现重复键错误,因为串行数据类型中隐含的序列 returns 已经存在的数字。
为了解决这个问题,我们必须为 PostgreSQL 重置 ID 顺序, 这是分步指南:
- 登录数据库 shell 并连接到您的数据库
- 首先,检查 table 的 id 列的最大值为
SELECT MAX(id) FROM your_table;
- 然后,检查 ID 的下一个值是什么:
SELECT nextval('your_table_id_seq');
- 如果nextval是下一个Max值的数字就对了。 例如 MAX=10 & nextval=11
否则将 table 的 id_seq 重置为:
BEGIN;
-- 在更新计数器时防止并发插入
LOCK TABLE your_table IN EXCLUSIVE MODE;
--更新序列
SELECT setval('your_table_id_seq', COALESCE((SELECT MAX(id)+1 FROM your_table), 1), false);
COMMIT;
我遇到了这个问题,因为我指定了自定义 import_id_fields
字段但没有排除 id
字段。
我指定了:
import_id_fields = ('code',)
skip_unchanged = True
report_skipped = True
但我需要:
import_id_fields = ('code',)
skip_unchanged = True
report_skipped = True
exclude = ('id',)
有点菜鸟错误,但这可能会为某人节省 google。
参考:https://github.com/django-import-export/django-import-export/issues/273
我经常 运行 for 循环。这也会更新我的自动日期时间字段:
import Article
for i in range(1, your_last_id + 1):
item = Article.objects.get(id=i)
item.save()
your_last_id 可能是 SELECT MAX(id)