Django 2.0:sqlite IntegrityError:FOREIGN KEY约束失败
我正在为django-pagetree库添加Django
2.0支持。在自动测试期间,使用sqlite内存数据库,我收到了很多这样的错误:
File "/home/nnyby/src/django-pagetree/pagetree/tests/test_models.py", line 638, in setUp
'children': [],
File "/home/nnyby/src/django-pagetree/pagetree/models.py", line 586, in add_child_section_from_dict
...
File "/home/nnyby/src/django-pagetree/venv/lib/python3.5/site-packages/django/db/backends/base/base.py", line 239, in _commit
return self.connection.commit()
django.db.utils.IntegrityError: FOREIGN KEY constraint failed
Django
2.0发行说明中对此进行了说明:https :
//docs.djangoproject.com/en/2.0/releases/2.0/#foreign-key-constraints-are-
now-enabled-on-
sqlite
根据我不完全理解的描述,这不适用于不是持久性的测试数据库,对吗?使用Django 2.0时,不会使用适当的选项创建我的sqlite测试数据库吗?
我用于测试的应用程序设置在这里:https : //github.com/ccnmtl/django-
pagetree/blob/master/runtests.py
-
该文档说两件事:
- 如果您有ForeignKey约束,那么现在可以在数据库级别强制实施它们。因此,请确保您没有违反外键约束。这是最可能导致问题的原因,尽管那意味着您已经在其他数据库中看到了这些问题。在您的代码中查找如下所示的模式:
# in pagetree/models.py, line 810
@classmethod
def create_from_dict(cls, d):
return cls.objects.create() # what happens to d by the way?
这肯定会因ForeignKey约束错误而失败,因为
PageBlock
必须具有section
,所以您必须create
先分配它才能调用。- 如果您通过执行原子事务(例如)来推迟提交外键来规避外键约束,则需要将外键初始化。确实,您的测试数据库应该已经具有了,因为它每次都会被重建。
- 如果您有ForeignKey约束,那么现在可以在数据库级别强制实施它们。因此,请确保您没有违反外键约束。这是最可能导致问题的原因,尽管那意味着您已经在其他数据库中看到了这些问题。在您的代码中查找如下所示的模式: