python - Django 2.0 : sqlite IntegrityError: FOREIGN KEY constraint failed

标签 python django sqlite foreign-keys django-2.0

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

最佳答案

文档说明了两件事:

  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?
    

    这肯定会因外键约束错误而失败,因为 PageBlock 必须具有 section,因此您不能在没有先分配的情况下调用 create

  2. 如果您通过执行原子事务(例如)延迟提交外键来规避外键约束,则您的外键需要初始延迟。事实上,您的测试数据库应该已经有了,因为它每次都会重建。

关于python - Django 2.0 : sqlite IntegrityError: FOREIGN KEY constraint failed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47620487/

相关文章:

python - pandas 使用列拆分作为新索引设置索引

python - 为什么 fftfreq 会产生负值?

mysql - 如何解决迁移错误?

java - 在android中比较两个字符串

python - “serial”没有属性串行错误,不是文件名或导入方法

python - 使用 BeauitifulSoup 进行网页抓取错误 : [Errno 10061]

python - Django 模板是否缓存在浏览器中?

python - 内置查看登录: Error handling and good practice

java - 在android数据库中存储 float

sql - 嵌套,分组Sqlite语法?