table 从备份恢复后出现 IntegrityError,PostgreSQL + Django
IntegrityError after table restore from backup, PostgreSQL + Django
我正在尝试从一些数据库备份中恢复我的数据库中的 table。备份是通过 pgAdmin 4
UI 工具创建的,select a table 然后备份它。这是 pgAdmin
执行的命令:
--file "C:\Users\cchie\DOCUME~1\DB_BAC~1\CURREN~1" --host "localhost" --port "5432" --username "postgres" --no-password --verbose --format=c --blobs --table "public.cosmetic_crawler_currency" "last_cosmetics"
问题是我在那个 table 中有一个 AutoField
,当我恢复 table,然后尝试向其中添加新项目时 - 我有这样的错误:
psycopg2.IntegrityError: duplicate key value violates unique constraint "cosmetic_crawler_product_pkey"
DETAIL: Key (product_id)=(27) already exists.
The above exception was the direct cause of the following exception:
django.db.utils.IntegrityError: duplicate key value violates unique constraint "cosmetic_crawler_product_pkey"
DETAIL: Key (product_id)=(27) already exists.
据我了解 - 这意味着 PostgreSQL 服务器不知道我已经恢复了 AutoField
计数器并且 试图从 0 开始计数? 有没有办法解决这个问题并让它从最后一个数字开始计数?
有人告诉我必须使用 this recipe。但是当我 运行 manage.py sqlsequencereset my_app_name
- 我看到那个命令 运行s:
BEGIN;
SELECT setval(pg_get_serial_sequence('"cosmetic_crawler_product"','product_id'), coalesce(max("product_id"), 1), max("product_id") IS NOT null) FROM "cosmetic_crawler_product";
SELECT setval(pg_get_serial_sequence('"cosmetic_crawler_sale"','sale_id'), coalesce(max("sale_id"), 1), max("sale_id") IS NOT null) FROM "cosmetic_crawler_sale";
SELECT setval(pg_get_serial_sequence('"cosmetic_crawler_promo"','promo_id'), coalesce(max("promo_id"), 1), max("promo_id") IS NOT null) FROM "cosmetic_crawler_promo";
SELECT setval(pg_get_serial_sequence('"cosmetic_crawler_brand_shops"','id'), coalesce(max("id"), 1), max("id") IS NOT null) FROM "cosmetic_crawler_brand_shops";
SELECT setval(pg_get_serial_sequence('"cosmetic_crawler_brand_categories"','id'), coalesce(max("id"), 1), max("id") IS NOT null) FROM "cosmetic_crawler_brand_categories";
SELECT setval(pg_get_serial_sequence('"cosmetic_crawler_brand"','brand_id'), coalesce(max("brand_id"), 1), max("brand_id") IS NOT null) FROM "cosmetic_crawler_brand";
COMMIT;
但这仍然没有效果 - 当我添加新项目时 - PostgreSQL 一直从 0 开始计数(更精确 - 从之前因 IntegrityError 而失败的最后一个数字开始计数)。
P.S。还原过程与备份相同 - 在 pgAdmin
UI.
中手动
sqlsequencereset
只打印命令,而不是 运行。
您必须 运行 命令,使用 pgAdmin
或 manage.py dbshell
。
根据 "Alasdair" 的建议,您可以获得解决问题的命令 运行 sqlsequencereset
。
或
您可以通过这种方式从 python 中执行由 sqlsequencereset
生成的 SQL 查询(使用默认数据库):
from django.core.management.color import no_style
from django.db import connection
from myapps.models import MyModel1, MyModel2
sequence_sql = connection.ops.sequence_reset_sql(no_style(), [MyModel1, MyModel2])
with connection.cursor() as cursor:
for sql in sequence_sql:
cursor.execute(sql)
我用 Python3.6、Django 2.0 和 Postgre[=32 测试了这段代码=] 10.
我正在尝试从一些数据库备份中恢复我的数据库中的 table。备份是通过 pgAdmin 4
UI 工具创建的,select a table 然后备份它。这是 pgAdmin
执行的命令:
--file "C:\Users\cchie\DOCUME~1\DB_BAC~1\CURREN~1" --host "localhost" --port "5432" --username "postgres" --no-password --verbose --format=c --blobs --table "public.cosmetic_crawler_currency" "last_cosmetics"
问题是我在那个 table 中有一个 AutoField
,当我恢复 table,然后尝试向其中添加新项目时 - 我有这样的错误:
psycopg2.IntegrityError: duplicate key value violates unique constraint "cosmetic_crawler_product_pkey"
DETAIL: Key (product_id)=(27) already exists.
The above exception was the direct cause of the following exception:
django.db.utils.IntegrityError: duplicate key value violates unique constraint "cosmetic_crawler_product_pkey"
DETAIL: Key (product_id)=(27) already exists.
据我了解 - 这意味着 PostgreSQL 服务器不知道我已经恢复了 AutoField
计数器并且 试图从 0 开始计数? 有没有办法解决这个问题并让它从最后一个数字开始计数?
有人告诉我必须使用 this recipe。但是当我 运行 manage.py sqlsequencereset my_app_name
- 我看到那个命令 运行s:
BEGIN;
SELECT setval(pg_get_serial_sequence('"cosmetic_crawler_product"','product_id'), coalesce(max("product_id"), 1), max("product_id") IS NOT null) FROM "cosmetic_crawler_product";
SELECT setval(pg_get_serial_sequence('"cosmetic_crawler_sale"','sale_id'), coalesce(max("sale_id"), 1), max("sale_id") IS NOT null) FROM "cosmetic_crawler_sale";
SELECT setval(pg_get_serial_sequence('"cosmetic_crawler_promo"','promo_id'), coalesce(max("promo_id"), 1), max("promo_id") IS NOT null) FROM "cosmetic_crawler_promo";
SELECT setval(pg_get_serial_sequence('"cosmetic_crawler_brand_shops"','id'), coalesce(max("id"), 1), max("id") IS NOT null) FROM "cosmetic_crawler_brand_shops";
SELECT setval(pg_get_serial_sequence('"cosmetic_crawler_brand_categories"','id'), coalesce(max("id"), 1), max("id") IS NOT null) FROM "cosmetic_crawler_brand_categories";
SELECT setval(pg_get_serial_sequence('"cosmetic_crawler_brand"','brand_id'), coalesce(max("brand_id"), 1), max("brand_id") IS NOT null) FROM "cosmetic_crawler_brand";
COMMIT;
但这仍然没有效果 - 当我添加新项目时 - PostgreSQL 一直从 0 开始计数(更精确 - 从之前因 IntegrityError 而失败的最后一个数字开始计数)。
P.S。还原过程与备份相同 - 在 pgAdmin
UI.
sqlsequencereset
只打印命令,而不是 运行。
您必须 运行 命令,使用 pgAdmin
或 manage.py dbshell
。
根据 "Alasdair" 的建议,您可以获得解决问题的命令 运行 sqlsequencereset
。
或
您可以通过这种方式从 python 中执行由 sqlsequencereset
生成的 SQL 查询(使用默认数据库):
from django.core.management.color import no_style
from django.db import connection
from myapps.models import MyModel1, MyModel2
sequence_sql = connection.ops.sequence_reset_sql(no_style(), [MyModel1, MyModel2])
with connection.cursor() as cursor:
for sql in sequence_sql:
cursor.execute(sql)
我用 Python3.6、Django 2.0 和 Postgre[=32 测试了这段代码=] 10.