django新增class的時候數據庫格式出錯

這幾天開發頻繁要求查看生產環境zookeeper的配置,於是就想在django裏添加一個新的欄,以文本的形式,隨時更新zookeeper的情況。


於是我就登陸了django,在model.py裏添加一個新的class,如下:

#建立杭州測試ZK配置
class HZfunczk(models.Model):
    hzfunczk_remark = models.CharField(verbose_name='杭州測試ZK配置',max_length=50000,blank=true)
    hzfunczk_signer = models.CharField(verbose_name='登記人',max_length=30,default='system')
    hzfunczk_signtime = models.DateField(auto_now_add=True)

    def __unicode__(self):
        return self.domain_name


然後在django的目錄下執行#python manage.py makemigrations,這一步沒問題,但是在執行#python manage.py migrate的時候,就出現了下面的錯誤:

1.png


我開始認爲是charfield寫錯了,應該寫Textfield,於是更改了一下,但是保存之後,再執行#python manage.py migrate還是出錯。其實這個錯誤主要原因就是因爲我那個50000設置錯了,因爲字段hzfunczk_remark定義的長度50000超出了mysql的varchar的最大長度21845(在utf8編碼情況下)。於是我就在model.py裏把這個長度改成20000,保存之後,還是執行到#python manage.py migrate這一步,依舊爆上面的錯誤。於是我就乾脆把這個class先刪除掉,沒想到都刪除了,還是會爆錯。


這就很奇怪了,我已經刪掉了爲啥還有這樣的事兒?於是就乾脆進入到數據庫去看,由於我現在只知道列名叫hzfunczk_remark,所以我要根據這個列名去查它所在的表,maria反饋如下:

MariaDB [abccs]> select TABLE_SCHEMA, TABLE_NAME from information_schema.columns where COLUMN_NAME = 'hzfunczk_remark'; 
Empty set (0.02 sec)


好尷尬呀,數據庫裏壓根就沒有列名爲“hzfunczk_remark”的表。然後由於#python manage.py migrate報錯,現在無法啓動django。遇到這種狀況,就去django裏的migrations文件夾,這個文件夾裏有很多的py文件,它們記錄着數據庫的每一步操作,不過這裏面的py還沒有真正執行到數據庫裏,我找到當時添加class那個時間段的py文件,裏面是這樣的:

image.png


先把裏面CharField改成TextField,然後把50000改成小於21845的就行了。或者把這個文件以及之後產生的所有文件都刪除掉。重新的去make。


實在不行,還有一個萬不得已的辦法,幾乎所有的數據庫錯誤都可以用這個方法解決:將migrations文件夾下的文件除了__init__.py全部刪掉,然後將數據庫drop掉,重新建數據庫。然後make和migrate,就可以使用一個新的數據庫(但願你永遠用不到這個方法)。



最後的最後,如果您覺得本文對您升職加薪有幫助,那麼請不吝贊助之手,刷一下下面的二維碼,贊助本人繼續寫更多的博文!

wKioL1l16m3BMYDKAACPHEqd55Q687.jpg


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