Python學習——Django數據庫遷移衝突

我們在學習框架的時候不可避免的要用到數據庫,所以框架主要就是和數據庫打交道,但是在進行數據遷移的時候難免會出現一點小BUG,此以Django爲例,進行二次數據庫遷移的時候可能會出現遷移文件已經存在,遷移信息衝突的問題嗎,或者是數據庫表已經存在,都會報錯。我們今天講的就是遷移信息衝突的問題。

You are trying to add a non-nullable field 'u_c' to courses without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
 2) Quit, and let me add a default in models.py
Select an option: ^CTraceback (most recent call last):

報了這個錯我們怎麼辦呢?不要急,我們下面舉個例子來說明一下怎麼解決。(不過要是刪庫的話也不是不可以,強烈建議不要刪庫,道理應該懂的)
舉個例子吧:第一步:我們先創建兩個表,分別是Users和courses

代碼如下:
from django.db import models

# Create your models here.
class Users(models.Model):
    u_name = models.CharField(max_length=32)
    u_age = models.CharField(max_length=12)

    class Meta:
        db_table = 'users'

class Courses(models.Model):
    c_name = models.CharField(max_length=20)
    c_scorse = models.IntegerField

    class Meta:
        db_table = 'courses'

第二步:然後我們在pycharm終端中執行:

python manage.py makemigrations
python manage.py migrate

進行數據遷移
將數據進行遷移,如圖所示,表示遷移成功。這時候會生成一個遷移文件在我們的數據庫中還會生成一張表是專門用來存儲遷移信息的,這兩個就是我們要修改的重點。
第三步:但是我們還想再給courses加個外鍵,我們對courses進行修改

class Courses(models.Model):
    c_name = models.CharField(max_length=20)
    c_scorse = models.IntegerField
    u_c = models.Foreignkey(Users)

    class Meta:
        db_table = 'courses'

代碼修改完之後呢,然後再去執行第二步的時候會發現不行了
修改之後執行遷移
會報我們開頭的那個錯誤,這時候我們不管它。
第四步:ctrl+c退出,先把之前生成的表給刪除,然後去數據庫中去找django_migrations遷移信息,在這裏插入圖片描述
在這裏插入圖片描述
這時候我們可以看到剛纔我們進行遷移的時候的遷移信息,然後點擊上面的“-”
把它刪除之後,按“DB”提交到數據庫,還有一步就是把生成的遷移文件也幹掉就行了。
該清的都清掉啦,我們再去執行第二步就大功告成了。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章