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的时候,就出现了下面的错误:

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


我开始认为是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反馈如下:

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

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


先把里面CharField改成TextField,然后把50000改成小于21845的就行了。或者把这个文件以及之后产生的所有文件都删除掉。重新的去make。


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



最后的最后,如果您觉得本文对您升职加薪有帮助,那么请不吝赞助之手,刷一下下面的二维码,赞助本人继续写更多的博文!

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




 本文转自 苏幕遮618 51CTO博客,原文链接:http://blog.51cto.com/chenx1242/2052559