Django更新models數(shù)據(jù)庫(kù)結(jié)構(gòu)步驟
有時(shí)候在我們使用Django設(shè)計(jì)了models中的數(shù)據(jù)庫(kù)結(jié)構(gòu),并且已經(jīng)同步了數(shù)據(jù)庫(kù)之后,我們突然想在數(shù)據(jù)表中更新或者增加新的字段,也就是需要修改數(shù)據(jù)庫(kù)的結(jié)構(gòu),會(huì)出現(xiàn)以下的問(wèn)題:
C:\Users\Administrator\Desktop\Web開(kāi)發(fā)\Django_Demo\jkxy>python manage.py makemigrations
You are trying to add a non-nullable field 'grade' to student without a default; we can't do that (the dat
abase 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:
就是在我們?cè)趍odels中修改了表的字段后,進(jìn)行python manage.py makemigrations同步數(shù)據(jù)庫(kù)時(shí)會(huì)出現(xiàn)上面報(bào)錯(cuò),會(huì)導(dǎo)致數(shù)據(jù)庫(kù)結(jié)構(gòu)更新失敗
解決方法如下:
第一種方式:先刪除再重構(gòu)
1、刪除數(shù)據(jù)庫(kù)對(duì)應(yīng)的數(shù)據(jù)表
注意:在這里可以不用暴力刪除數(shù)據(jù)表,可以利用django的migrations進(jìn)行,操作如下:
1.1、首先將自己需要重構(gòu)的數(shù)據(jù)表類(lèi)的models注釋掉,然后輸入命令python manage.py makemigrations,這個(gè)時(shí)候migration會(huì)自動(dòng)記錄刪除數(shù)據(jù)表的操作
1.2、然后在輸入命令python manage.py migrate,Django會(huì)自動(dòng)將本地對(duì)應(yīng)的數(shù)據(jù)庫(kù)進(jìn)行刪除
2、刪除應(yīng)用當(dāng)中的migrations文件
3、刪除應(yīng)用當(dāng)中的pychace文件
4、刪除db_sqllite文件(若配置數(shù)據(jù)庫(kù)為mysql時(shí),可以刪除db_sqllite)
5、建立一個(gè)空數(shù)據(jù)庫(kù),命令為python manage.py makemigrations --empty 應(yīng)用名稱(chēng)
C:\Users\Administrator\Desktop\Web開(kāi)發(fā)\Django_Demo\jkxy>python manage.py makemigrations --empty bbs
Migrations for 'bbs':
bbs\migrations\0001_initial.py
6、同步數(shù)據(jù)庫(kù):
python manage.py makemigrations python manage.py migrate C:\Users\Administrator\Desktop\Web開(kāi)發(fā)\Django_Demo\jkxy>python manage.py makemigrations --empty bbs Migrations for 'bbs': bbs\migrations\0001_initial.py C:\Users\Administrator\Desktop\Web開(kāi)發(fā)\Django_Demo\jkxy>python manage.py makemigrations Migrations for 'bbs': bbs\migrations\0002_student_testmyfield.py - Create model Student - Create model Testmyfield C:\Users\Administrator\Desktop\Web開(kāi)發(fā)\Django_Demo\jkxy>python manage.py migrate Operations to perform: Apply all migrations: admin, auth, bbs, contenttypes, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying bbs.0001_initial... OK Applying bbs.0002_student_testmyfield... OK Applying sessions.0001_initial... OK
第二種方式:直接在原結(jié)構(gòu)上更新結(jié)構(gòu)
#出版社 class Publisher(models.Model): '''出版社數(shù)據(jù)表''' id=models.AutoField(primary_key=True) #自增ID主鍵 name=models.CharField(max_length=50,verbose_name='出版社名稱(chēng)',null=False,unique=True) def __str__(self): return '{},{}'.format(self.id,self.name)
接下來(lái)我們需要新增一個(gè)字段addr地址
#出版社 class Publisher(models.Model): '''出版社數(shù)據(jù)表''' id=models.AutoField(primary_key=True) #自增ID主鍵 name=models.CharField(max_length=50,verbose_name='出版社名稱(chēng)',null=False,unique=True) addr=models.CharField(max_length=128,verbose_name='出版社地址') def __str__(self): return '{},{}'.format(self.id,self.name,self.addr)
由于我們的數(shù)據(jù)庫(kù)的Publisher表本身已經(jīng)有數(shù)據(jù)了,所以我們?cè)谶M(jìn)行python manage.py makemigrations會(huì)出現(xiàn)以下錯(cuò)誤:
上圖的意思是說(shuō)addr沒(méi)有默認(rèn)值,無(wú)法更新到數(shù)據(jù)庫(kù)中,然后給出了兩個(gè)選項(xiàng):
第一是讓你馬上給定一個(gè)默認(rèn)值,然后一次性的把所有addr都寫(xiě)成這個(gè)值
第二是先退出,你自己在models里面去配置默認(rèn)值
我選擇先退出,在models中加上默認(rèn)值,在進(jìn)行makemigrations,這次就會(huì)更新成功了!
#出版社 class Publisher(models.Model): '''出版社數(shù)據(jù)表''' id=models.AutoField(primary_key=True) #自增ID主鍵 name=models.CharField(max_length=50,verbose_name='出版社名稱(chēng)',null=False,unique=True) addr=models.CharField(max_length=128,verbose_name='出版社地址',default='成都市動(dòng)物園') def __str__(self): return '{},{}'.format(self.id,self.name,self.addr)
讓我們來(lái)檢查數(shù)據(jù)庫(kù)中的數(shù)據(jù)表:
可以看到數(shù)據(jù)結(jié)構(gòu)發(fā)生了變化!
以上這篇Django更新models數(shù)據(jù)庫(kù)結(jié)構(gòu)步驟就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
django創(chuàng)建最簡(jiǎn)單HTML頁(yè)面跳轉(zhuǎn)方法
今天小編就為大家分享一篇django創(chuàng)建最簡(jiǎn)單HTML頁(yè)面跳轉(zhuǎn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08利用python GDAL庫(kù)讀寫(xiě)geotiff格式的遙感影像方法
今天小編就為大家分享一篇利用python GDAL庫(kù)讀寫(xiě)geotiff格式的遙感影像方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11python解析中國(guó)天氣網(wǎng)的天氣數(shù)據(jù)
最近學(xué)習(xí)python 感覺(jué)這門(mén)腳本語(yǔ)言十分靈活 而且功能十分強(qiáng)大 尤其是他re庫(kù)用于正則匹配十分強(qiáng)大,寫(xiě)了個(gè)例子解析中國(guó)天氣網(wǎng)2014-03-03教你使用conda虛擬環(huán)境管理(創(chuàng)建、激活、重命名、刪除虛擬環(huán)境)
conda是一個(gè)強(qiáng)大的Python包管理和環(huán)境管理工具,它可以幫助我們輕松地安裝、更新、卸載和切換不同版本的Python和各種第三方庫(kù),本文就來(lái)介紹一下conda虛擬環(huán)境管理(創(chuàng)建、激活、重命名、刪除虛擬環(huán)境),感興趣的可以了解一下2024-01-01基于Python實(shí)現(xiàn)圖片瀏覽器的應(yīng)用程序
圖像瀏覽器應(yīng)用程序是一種非常常見(jiàn)和實(shí)用的工具,這篇文章就來(lái)為大家介紹一下如何使用Python編程語(yǔ)言和wxPython庫(kù)創(chuàng)建一個(gè)簡(jiǎn)單的圖像瀏覽器應(yīng)用程序,感興趣的可以了解下2023-10-10Python實(shí)現(xiàn)讀取文件的方法總結(jié)
這篇文章主要為大家詳細(xì)介紹了Python中實(shí)現(xiàn)讀取文件效果的幾種方法總結(jié),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-09-09Python制作基礎(chǔ)學(xué)生信息管理系統(tǒng)
本文詳細(xì)講解了Python制作基礎(chǔ)學(xué)生信息管理系統(tǒng)的實(shí)現(xiàn),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12Python實(shí)現(xiàn)視頻分解成圖片+圖片合成視頻
這篇文章主要介紹了如何利用Python實(shí)現(xiàn)視頻分解成圖片以及將圖片合成為視頻,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-04-04