簡體   English   中英

Django 2.0:sqlite IntegrityError:外鍵約束失敗

[英]Django 2.0: sqlite IntegrityError: FOREIGN KEY constraint failed

我正在努力將 Django 2.0 支持添加到django-pagetree庫。 在自動化測試期間,使用 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?

    這肯定會因 ForeignKey 約束錯誤而失敗,因為PageBlock必須有section ,所以如果沒有先分配它就不能調用create

  2. 如果您通過執行原子事務(例如)推遲提交外鍵來規避外鍵約束,則您的外鍵需要初始延遲。 實際上,您的測試數據庫應該已經擁有它,因為它每次都重新構建。

我遇到了同樣錯誤的不同情況。 問題是我使用了相同的模型名稱和字段名稱

不正確的代碼:

class Column(models.Model):
    ...

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

解決方案:

class Column(models.Model):
    ...

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

您是否已將 on_delete 添加到您的 FOREIGN KEY 中? 在 Django 2.0 上,此參數是必需的。 您還可以看到: https ://docs.djangoproject.com/en/2.0/ref/models/fields/#django.db.models.ForeignKey.on_delete https://docs.djangoproject.com/en/2.0/howto /upgrade-version/ https://docs.djangoproject.com/en/2.0/topics/db/examples/many_to_one/ https://docs.djangoproject.com/en/2.0/ref/models/fields/#django。 db.models.ForeignKey

就我而言,我發現我的模型引用的 ForeignKey 對象不存在。 所以我只是將引用的 FK 對象更改為存在對象。

我剛剛遇到這個錯誤: sqlite3.IntegrityError: FOREIGN KEY constraint failed on my Django project。 結果我刪除了遷移文件夾,所以當我運行python manage.py makemigrations時它沒有接收到我的模型更改。 只要確保您仍然有一個包含遷移的遷移文件夾。

還有一件事要檢查,在我的情況下,它與我的裝置文件有關。 遷移到 Django3 后重新生成它們解決了我在測試我的應用程序時遇到的問題。

./manage.py dumpdata app.Model1 app.Model2 --indent=4 > ./app/fixtures/file.json

當我在遷移或表方面遇到問題時,我會這樣做,並且通常會有所幫助:

  1. 評論你的問題字符串;
  2. python3 manage.py makemigrationspython3 manage.py migrate
  3. 然后你必須做python3 manage.py migrate --fake
  4. 取消注釋您的字符串並再次執行python3 manage.py makemigrationspython3 manage.py migrate

我希望它對你有用

遷移后我的問題得到了解決,因為我更改了外鍵然后沒有應用遷移。

具體來說,起初我在模型中有以下代碼:

class TeacherRequest(models.Model):
    requester = models.ForeignKey(
        Profile,
        on_delete=models.CASCADE,
        related_name="teacher_request",
    )

    class RequestStatus(models.TextChoices):
        PENDING = '1', _('pending')
        APPROVED = '2', _('approved')
        REJECTED = '3', _('rejected')

    status = models.CharField(
        choices=RequestStatus.choices,
        max_length=1,
        default=RequestStatus.PENDING,
    )

然后我將外鍵從Profile更改為User


class TeacherRequest(models.Model):
    requester = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        related_name="teacher_request",
    )

    class RequestStatus(models.TextChoices):
        PENDING = '1', _('pending')
        APPROVED = '2', _('approved')
        REJECTED = '3', _('rejected')

    status = models.CharField(
        choices=RequestStatus.choices,
        max_length=1,
        default=RequestStatus.PENDING,
    )

解決方案

python manage.py makemigrations
python manage.py migrate

一個原因可能是您錯誤地計算了當您從數據庫中刪除一個與其他地方的外鍵鏈接的項目時會發生什么。

pe 當您刪除具有活動書籍的作者時會發生什么?

我並不是要進入應用程序的邏輯,而是考慮例如cascade刪除鏈接到該鍵的元素。

這是一個示例,在這種情況下,我們正在處理每個“用戶”的“post”屬性

user = models.ForeignKey(User, related_name='posts', on_delete=models.CASCADE)

這是一個仔細的解釋,Django 4.0: https ://docs.djangoproject.com/en/4.0/ref/models/fields/

錯誤的原因很可能是模型中缺少匹配的外鍵元素以及您嘗試保存的元素(使用該外鍵更新)。 確保您的數據和新數據中都存在外鍵約束(值)

我遇到了同樣錯誤的不同情況。

問題是我將on_delete屬性設置為DO_NOTHING ,這最終violating foreign key constraints

將其設置為SET_NULL為我修復了它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM