Django 2.0: sqlite IntegrityError: FOREIGN KEY constraint failed


I’m working on adding Django 2.0 support to the django-pagetree library. During automated testing, using an sqlite in-memory database, I’m getting a bunch of errors like this:

  File "/home/nnyby/src/django-pagetree/pagetree/tests/", line 638, in setUp
    'children': [],
  File "/home/nnyby/src/django-pagetree/pagetree/", line 586, in add_child_section_from_dict


  File "/home/nnyby/src/django-pagetree/venv/lib/python3.5/site-packages/django/db/backends/base/", line 239, in _commit
    return self.connection.commit()
django.db.utils.IntegrityError: FOREIGN KEY constraint failed

This is noted in the Django 2.0 release notes:

From that description, which I don’t fully understand, this shouldn’t apply for test databases that aren’t persistent, right? Wouldn’t my sqlite test db get created with the appropriate options when using Django 2.0?

The app settings I’m using for testing are here:


The documentation says two things:

  1. If you have ForeignKey constraints they are now enforced at the database level. So make sure you’re not violating a foreign key constraint. That’s the most likely cause for your issue, although that would mean you’d have seen these issues with other databases. Look for patterns like this in your code:

    # in pagetree/, line 810
    def create_from_dict(cls, d):
        return cls.objects.create()  # what happens to d by the way?

    This will definitely fail with a ForeignKey constraint error since a PageBlock must have section, so you can’t call create without first assigning it.

  2. If you circumvent the foreign key constraint by performing an atomic transaction (for example) to defer committing the foreign key, your Foreign Key needs to be INITIALLY DEFERRED. Indeed, your test db should already have that since it’s rebuilt every time.

Answered By – dirkgroten

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply

(*) Required, Your email will not be published