小编典典

Django 2.0:sqlite IntegrityError:FOREIGN KEY约束失败

python

我正在为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


阅读 211

收藏
2021-01-20

共1个答案

小编典典

该文档说两件事:

  1. 如果您有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先分配它才能调用。

  1. 如果您通过执行原子事务(例如)来推迟提交外键来规避外键约束,则需要将外键初始化。确实,您的测试数据库应该已经具有了,因为它每次都会被重建。
2021-01-20