IntegrityError when loading fixture during django testing
Asked Answered
D

2

25

I'm loading a fixture created with dumpdata, and getting the following exception:

Problem installing fixture 'db_dump.json': Traceback (most recent call last):
  File "/usr/lib/python2.6/site-packages/django/core/management/commands/loaddata.py", line 174, in handle
    obj.save(using=using)
  File "/usr/lib/python2.6/site-packages/django/core/serializers/base.py", line 165, in save
    models.Model.save_base(self.object, using=using, raw=True)
  File "/usr/lib/python2.6/site-packages/django/db/models/base.py", line 526, in save_base
    rows = manager.using(using).filter(pk=pk_val)._update(values)
  File "/usr/lib/python2.6/site-packages/django/db/models/query.py", line 491, in _update
    return query.get_compiler(self.db).execute_sql(None)
  File "/usr/lib/python2.6/site-packages/django/db/models/sql/compiler.py", line 869, in execute_sql
    cursor = super(SQLUpdateCompiler, self).execute_sql(result_type)
  File "/usr/lib/python2.6/site-packages/django/db/models/sql/compiler.py", line 735, in execute_sql
    cursor.execute(sql, params)
  File "/usr/lib/python2.6/site-packages/django/db/backends/sqlite3/base.py", line 234, in execute
    return Database.Cursor.execute(self, query, params)
IntegrityError: columns app_label, model are not unique

This is with a sqlite3 backend.

Update: Using natural keys doesn't make a difference here.

What does it mean, and why is it happening?

Drees answered 22/6, 2011 at 22:16 Comment(0)
D
50

Apparently one of the traps for the unwary is that one must exclude contenttypes when exporting fixtures. (Thanks to subsume on #django for the information).

To exclude content types use the -e option when running the dumpdata command.

$./manage.py dumpdata -e contenttypes > initial_data.json
Drees answered 22/6, 2011 at 23:16 Comment(2)
Yup, been hit by that one a few times, though only when migrating dev dbs from one engine to another. A general rule for test fixtures is that you should know exactly what's in them, so you know what's going on in your tests, so you don't have any surprises.Poppo
Something like this worked for me (just for further reference): ./manage.py dumpdata -e contenttypes > initial_data.json .Croix
N
11
python manage.py dumpdata --exclude=contenttypes --exclude=auth.Permission > initial_data.json
Northernmost answered 18/10, 2013 at 9:19 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.