Django 2.0:sqlite IntegrityError:外键约束失败

2024-05-20 21:28:31 发布

您现在位置: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


Tags: djangoinpysrc数据库homedbsqlite
1条回答
网友
2楼 · 发布于 2024-05-20 21:28:31

文件说明了两件事:

  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,因此这肯定会失败,并出现ForeignKey约束错误。

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

网友
3楼 · 发布于 2024-05-20 21:28:31

A遇到了一个有点不同的情况和同样的错误。问题是我使用相同的模型名和字段名

错误的代码

class Column(models.Model):
    ...

class ColumnToDepartment(models.Model):
    column = models.ForeignKey(Column, on_delete=models.CASCADE)

苏黎世

class Column(models.Model):
    ...

class ColumnToDepartment(models.Model):
    col = models.ForeignKey(Column, on_delete=models.CASCADE)

相关问题 更多 >