django新增class的时候数据库格式出错

这几天开发频繁要求查看生产环境zookeeper的配置,于是就想在django里添加一个新的栏,以文本的形式随时更新zookeeper的情况。

于是我就登陆了django,在model.py里添加一个新的class,如下:

1
2
3
4
5
6
7
8
#建立杭州测试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的时候,就出现了下面的错误:
akb48

我开始认为是charfield写错了,应该写Textfield,于是更改了一下,但是保存之后,再执行python manage.py migrate还是出错。其实这个错误主要原因就是因为我那个50000设置错了,因为字段hzfunczk_remark定义的长度50000超出了mysql的varchar的最大长度21845(在utf8编码情况下)。于是我就在model.py里把这个长度改成20000,保存之后,还是执行到python manage.py migrate这一步,依旧爆上面的错误。于是我就干脆把这个class先删除掉,没想到都删除光了,还是在make的时候会爆错。

这就很奇怪了,我已经删掉了为啥还有这样的事儿?于是就干脆进入到数据库去看,由于我现在只知道列名叫hzfunczk_remark,所以我要根据这个列名去查它所在的表,maria反馈如下:

1
2
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文件,里面是这样的:
akb48

先把里面CharField改成TextField,然后把50000改成小于21845的就行了。如果你性子比较烈,那就干脆把这个文件以及之后产生的所有文件都删除掉。重新的去make

如果还是实在不行,还有一个万不得已的办法,几乎所有的数据库错误都可以用这个方法解决:将migrations文件夹下的文件除了init.py全部删掉,然后将数据库drop掉,重新建数据库。然后make和migrate,就可以使用一个新的数据库(但愿你永远用不到这个方法)。

感谢您请我喝咖啡~O(∩_∩)O,如果要联系请直接发我邮箱chenx1242@163.com,我会回复你的
-------------本文结束感谢您的阅读-------------