postgresql Django 无法加载测试装置,IntegrityError
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/19857406/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Django unable to load test fixtures, IntegrityError
提问by Andres
I'm using Saleor/Satchlessto power and e-commerce site (inherited the project). I couldn't find a Saleor mailing list so posting here instead.
我正在使用Saleor/ Satchless为电子商务网站供电(继承了该项目)。我找不到 Saleor 邮件列表,所以在这里发帖。
I dumped the DB to create some test fixtures.
./manage.py dumpdata -e contenttypes -e sessions -e south -e > payments_data.json
./manage.py dumpdata -e contenttypes -e sessions -e south -e > payments_data.json
When I run the tests and django tries to load the fixtures it barfs this up. I'm using Postgres as the DB, and although not terribly familiar, it seems like there might be a problem with the order in which data is being loaded
当我运行测试并且 django 尝试加载设备时,它会阻止它。我使用 Postgres 作为数据库,虽然不是很熟悉,但似乎加载数据的顺序有问题
Any ideas how to get around it?
任何想法如何解决它?
======================================================================
ERROR: test__hometryon_extra_pair_sizes (payment.tests.InterstitialTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/andres/.virtualenvs/rpmwest/lib/python2.7/site-packages/django/test/testcases.py", line 259, in __call__
self._pre_setup()
File "/Users/andres/.virtualenvs/rpmwest/lib/python2.7/site-packages/django/test/testcases.py", line 479, in _pre_setup
self._fixture_setup()
File "/Users/andres/.virtualenvs/rpmwest/lib/python2.7/site-packages/django/test/testcases.py", line 849, in _fixture_setup
'skip_validation': True,
File "/Users/andres/.virtualenvs/rpmwest/lib/python2.7/site-packages/django/core/management/__init__.py", line 161, in call_command
return klass.execute(*args, **defaults)
File "/Users/andres/.virtualenvs/rpmwest/lib/python2.7/site-packages/django/core/management/base.py", line 255, in execute
output = self.handle(*args, **options)
File "/Users/andres/.virtualenvs/rpmwest/lib/python2.7/site-packages/django/core/management/commands/loaddata.py", line 224, in handle
connection.check_constraints(table_names=table_names)
File "/Users/andres/.virtualenvs/rpmwest/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 132, in check_constraints
self.cursor().execute('SET CONSTRAINTS ALL IMMEDIATE')
File "/Users/andres/.virtualenvs/rpmwest/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 56, in execute
six.reraise(utils.IntegrityError, utils.IntegrityError(*tuple(e.args)), sys.exc_info()[2])
File "/Users/andres/.virtualenvs/rpmwest/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 54, in execute
return self.cursor.execute(query, args)
IntegrityError: Problem installing fixtures: insert or update on table "product_ship" violates foreign key constraint "product_ship_product_ptr_id_fkey"
DETAIL: Key (product_ptr_id)=(1) is not present in table "product_product".
Update:Started playing around with django-fixture-magicI discovered that product.product
is not actually being dumped even when I do a
$ python manage.py dumpdata --indent=4 --all -e contenttypes -e sessions -e south > fulldb.json
更新:开始玩弄django-fixture-magic我发现product.product
即使我做了一个
$ python manage.py dumpdata --indent=4 --all -e contenttypes -e sessions -e south > fulldb.json
Update 2:After including contenttypes in the dumpdata, product.product was still missing in the actual data. I had to manually perform a dump_object and merge_fixture for product.product and order_deliverygroup. When loading the fixture, both gave similar errors to the following:
更新 2:在转储数据中包含 contenttypes 后,实际数据中仍然缺少 product.product。我必须为 product.product 和 order_deliverygroup 手动执行 dump_object 和 merge_fixture。加载夹具时,两者都给出了以下类似的错误:
IntegrityError: Problem installing fixtures: insert or update on table "order_shippeddeliverygroup" violates foreign key constraint "order_shippeddeliverygroup_deliverygroup_ptr_id_fkey" DETAIL: Key (deliverygroup_ptr_id)=(1) is not present in table "order_deliverygroup".
I am now left with this problem around Contenttypes
我现在在 Contenttypes 周围留下了这个问题
IntegrityError: Problem installing fixture '/Users/andres/Documents/projects/rpmwest/rpmwest/payment/fixtures/payments_data.json': Could not load contenttypes.ContentType(pk=5): duplicate key value violates unique constraint "django_content_type_app_label_model_key"DETAIL: Key (app_label, model)=(product, digitalship) already exists.
Looking at the data in the fixture, sure enough it's there, but there is only one of them. Is it clashing with the DB creating contenttypes when it initially syncs the models?
查看fixture中的数据,果然是有的,但是只有一个。当它最初同步模型时,它是否与创建内容类型的数据库发生冲突?
If I leave out the contenttypes I get the following error:
如果我省略了内容类型,则会出现以下错误:
Traceback (most recent call last):
File "/Users/andres/.virtualenvs/rpmwest/lib/python2.7/site-packages/django/test/testcases.py", line 259, in __call__
self._pre_setup()
File "/Users/andres/.virtualenvs/rpmwest/lib/python2.7/site-packages/django/test/testcases.py", line 479, in _pre_setup
self._fixture_setup()
File "/Users/andres/.virtualenvs/rpmwest/lib/python2.7/site-packages/django/test/testcases.py", line 849, in _fixture_setup
'skip_validation': True,
File "/Users/andres/.virtualenvs/rpmwest/lib/python2.7/site-packages/django/core/management/__init__.py", line 161, in call_command
return klass.execute(*args, **defaults)
File "/Users/andres/.virtualenvs/rpmwest/lib/python2.7/site-packages/django/core/management/base.py", line 255, in execute
output = self.handle(*args, **options)
File "/Users/andres/.virtualenvs/rpmwest/lib/python2.7/site-packages/django/core/management/commands/loaddata.py", line 224, in handle
connection.check_constraints(table_names=table_names)
File "/Users/andres/.virtualenvs/rpmwest/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 132, in check_constraints
self.cursor().execute('SET CONSTRAINTS ALL IMMEDIATE')
File "/Users/andres/.virtualenvs/rpmwest/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 56, in execute
six.reraise(utils.IntegrityError, utils.IntegrityError(*tuple(e.args)), sys.exc_info()[2])
File "/Users/andres/.virtualenvs/rpmwest/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 54, in execute
return self.cursor.execute(query, args)
IntegrityError: Problem installing fixtures: insert or update on table "django_admin_log" violates foreign key constraint "django_admin_log_content_type_id_fkey" DETAIL: Key (content_type_id)=(22) is not present in table "django_content_type".
回答by alko
Seems that django dumpdata dumped fixtures in wrong order. Look in json file to check whether product
with id: 1
is present there. If, as I suppose, this is true, use some more sophisticated tools to dump data, for example django-fixture-magic
似乎 django dumpdata 以错误的顺序转储了设备。查看 json 文件以检查那里是否存在product
with id: 1
。如果,如我所想,这是真的,使用一些更复杂的工具来转储数据,例如django-fixture-magic
Alternatively, you might want to delete all integrity constraints by means of db engine just before upload and try to recreate them right after, but this is somewhat risky if some integrity errors will be present.
或者,您可能希望在上传之前通过 db 引擎删除所有完整性约束,并尝试在上传之后立即重新创建它们,但是如果存在某些完整性错误,这有点冒险。
For PostgreSQL, consult this threadto know how to get your tables definitions. In MySQL it would be something like follows:
对于 PostgreSQL,请参阅此线程以了解如何获取表定义。在 MySQL 中,它将类似于以下内容:
$ mysqldump --no-data -utest django auth_user_user_permissions
CREATE TABLE `auth_user_user_permissions` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`permission_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `user_id` (`user_id`,`permission_id`),
KEY `auth_user_user_permissions_403f60f` (`user_id`),
KEY `auth_user_user_permissions_1e014c8f` (`permission_id`),
CONSTRAINT `user_id_refs_id_dfbab7d` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`),
CONSTRAINT `permission_id_refs_id_67e79cb` FOREIGN KEY (`permission_id`) REFERENCES `auth_permission` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Following part should work for oracle, postgre and mysql
以下部分应该适用于 oracle、postgre 和 mysql
> alter table `auth_user_user_permissions` drop foreign key `user_id_refs_id_dfbab7d`;
Query OK, 0 rows affected (0.97 sec)
Records: 0 Duplicates: 0 Warnings: 0
> alter table `auth_user_user_permissions` add CONSTRAINT `user_id_refs_id_dfbab7d` FOREIGN KEY (`user_id`) references `auth_user` (`id`);
Query OK, 0 rows affected (0.95 sec)
Records: 0 Duplicates: 0 Warnings: 0