小編給大家分享一下Django如何更新models數(shù)據(jù)庫結(jié)構(gòu),希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
有時候在我們使用Django設(shè)計了models中的數(shù)據(jù)庫結(jié)構(gòu),并且已經(jīng)同步了數(shù)據(jù)庫之后,我們突然想在數(shù)據(jù)表中更新或者增加新的字段,也就是需要修改數(shù)據(jù)庫的結(jié)構(gòu),會出現(xiàn)以下的問題:
C:\Users\Administrator\Desktop\Web開發(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:
就是在我們在models中修改了表的字段后,進行python manage.py makemigrations同步數(shù)據(jù)庫時會出現(xiàn)上面報錯,會導(dǎo)致數(shù)據(jù)庫結(jié)構(gòu)更新失敗
解決方法如下:
第一種方式:先刪除再重構(gòu)
1、刪除數(shù)據(jù)庫對應(yīng)的數(shù)據(jù)表
注意:在這里可以不用暴力刪除數(shù)據(jù)表,可以利用django的migrations進行,操作如下:
1.1、首先將自己需要重構(gòu)的數(shù)據(jù)表類的models注釋掉,然后輸入命令python manage.py makemigrations,這個時候migration會自動記錄刪除數(shù)據(jù)表的操作
1.2、然后在輸入命令python manage.py migrate,Django會自動將本地對應(yīng)的數(shù)據(jù)庫進行刪除
2、刪除應(yīng)用當中的migrations文件
3、刪除應(yīng)用當中的pychace文件
4、刪除db_sqllite文件(若配置數(shù)據(jù)庫為mysql時,可以刪除db_sqllite)
5、建立一個空數(shù)據(jù)庫,命令為python manage.py makemigrations --empty 應(yīng)用名稱
C:\Users\Administrator\Desktop\Web開發(fā)\Django_Demo\jkxy>python manage.py makemigrations --empty bbs
Migrations for 'bbs':
bbs\migrations\0001_initial.py
6、同步數(shù)據(jù)庫:
python manage.py makemigrations python manage.py migrate C:\Users\Administrator\Desktop\Web開發(fā)\Django_Demo\jkxy>python manage.py makemigrations --empty bbs Migrations for 'bbs': bbs\migrations\0001_initial.py C:\Users\Administrator\Desktop\Web開發(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開發(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='出版社名稱',null=False,unique=True) def __str__(self): return '{},{}'.format(self.id,self.name)
接下來我們需要新增一個字段addr地址
#出版社 class Publisher(models.Model): '''出版社數(shù)據(jù)表''' id=models.AutoField(primary_key=True) #自增ID主鍵 name=models.CharField(max_length=50,verbose_name='出版社名稱',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ù)庫的Publisher表本身已經(jīng)有數(shù)據(jù)了,所以我們在進行python manage.py makemigrations會出現(xiàn)以下錯誤:
上圖的意思是說addr沒有默認值,無法更新到數(shù)據(jù)庫中,然后給出了兩個選項:
第一是讓你馬上給定一個默認值,然后一次性的把所有addr都寫成這個值
第二是先退出,你自己在models里面去配置默認值
我選擇先退出,在models中加上默認值,在進行makemigrations,這次就會更新成功了!
#出版社 class Publisher(models.Model): '''出版社數(shù)據(jù)表''' id=models.AutoField(primary_key=True) #自增ID主鍵 name=models.CharField(max_length=50,verbose_name='出版社名稱',null=False,unique=True) addr=models.CharField(max_length=128,verbose_name='出版社地址',default='成都市動物園') def __str__(self): return '{},{}'.format(self.id,self.name,self.addr)
讓我們來檢查數(shù)據(jù)庫中的數(shù)據(jù)表:
可以看到數(shù)據(jù)結(jié)構(gòu)發(fā)生了變化!
看完了這篇文章,相信你對“Django如何更新models數(shù)據(jù)庫結(jié)構(gòu)”有了一定的了解,如果想了解更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
本文題目:Django如何更新models數(shù)據(jù)庫結(jié)構(gòu)-創(chuàng)新互聯(lián)
網(wǎng)站URL:http://chinadenli.net/article20/dedsjo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計公司、網(wǎng)站內(nèi)鏈、外貿(mào)網(wǎng)站建設(shè)、品牌網(wǎng)站制作、網(wǎng)站排名、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容