這幾天開發頻繁要求查看生產環境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的時候,就出現了下面的錯誤:
我開始認爲是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文件,裏面是這樣的:
先把裏面CharField改成TextField,然後把50000改成小於21845的就行了。或者把這個文件以及之後產生的所有文件都刪除掉。重新的去make。
實在不行,還有一個萬不得已的辦法,幾乎所有的數據庫錯誤都可以用這個方法解決:將migrations文件夾下的文件除了__init__.py全部刪掉,然後將數據庫drop掉,重新建數據庫。然後make和migrate,就可以使用一個新的數據庫(但願你永遠用不到這個方法)。
最後的最後,如果您覺得本文對您升職加薪有幫助,那麼請不吝贊助之手,刷一下下面的二維碼,贊助本人繼續寫更多的博文!