web-dev-qa-db-ja.com

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

6
nnyby

ドキュメントには2つのことが記載されています。

  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が必要なので、ForeignKey制約エラーでこれは間違いなく失敗します。したがって、最初に割り当てることなくcreateを呼び出すことはできません。

  2. アトミックトランザクション(たとえば)を実行して外部キーの制約を回避し、外部キーのコミットを延期する場合は、外部キーを最初に遅延させる必要があります。実際、毎回再構築されるので、テストデータベースには既にそれがあるはずです。

6
dirkgroten

同じエラーで少し異なる状況に遭遇しました。問題は、同じモデル名とフィールド名を使用することでした

間違ったコード

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)
1
Yuriy Gyerts
1
Krzysieqq

私はちょうどこのエラーがありました:sqlite3.IntegrityError: FOREIGN KEY constraint failed on my Django= project。行のどこかにある移行フォルダを削除したので、実行時にモデルの変更が反映されませんでしたpython manage.py makemigrations。移行が入った移行フォルダがまだあることを確認してください。

0