记一次痛苦的Django报错调试经历:

开发的程序在个人本地mac上,ubuntu上,以及树莓派上都成功实现了迁移和运行,可是当准备将运行好好地程序迁移到阿里云的服务器上的mysql数据库上时,出现了很是多的幺蛾子的问题。node

具体以下:python

初始化链接,执行python manage.py makemigrations; python manage.py migrate 生成部分表格(不全),报错。报错信息以下:mysql

Specified key was too long; max key length is 767 bytes

因为全部的报错信息都是django的内部信息,没法判断具体错误在哪一段代码上。在网上找了各类资料,mysql版本等多种问题均未不是我想要的解决方案,由于自己确认没问题。react

又赶上了Django从1.11.7升级到2.0的状况,看谁都像坏人。只能耐心地将django版本库升级到最新版后,将系统跑起来。在树莓派上测试仍是ok,阿里云仍是死。。。sql

后面又是逐步调整,把可能的全部的对象都搞了一遍,没有定位到错误。最后选择新建一个新的django项目,将models中的表一张张移过来,立刻发现varchar(256)改为255后就能够成功运行了。终于找到了问题所在。后面就是调试定位具体的缘由。数据库

下面的代码是models.py中的两个varchar(256)的表。django

from django.db import models

# Create your models here.


class Company(models.Model):
    '''公司表'''
    company_name=models.CharField(max_length=256,verbose_name='公司名称')
    industry=models.CharField(max_length=32,verbose_name='所属行业',blank=True,null=True)
    department=models.CharField(max_length=32,verbose_name='所属部门',blank=True,null=True)

    def __str__(self):
        return self.company_name

    class Meta:
        verbose_name='公司表'
        verbose_name_plural='公司表'


class Tags(models.Model):
    '''标签表'''
    tag_name=models.CharField(max_length=256,verbose_name='标签名称')
    shadow_mark_id=models.IntegerField(verbose_name='影子标签',blank=True,null=True)
    node_ancestor=models.ForeignKey('self',verbose_name='父节点',blank=True,null=True,on_delete=True)

    def __str__(self):
        return self.tag_name

    class Meta:
        unique_together=('tag_name','node_ancestor')
        verbose_name='标签表'
        verbose_name_plural='标签表'

逐步调整,最终发现,Company表中的varchar(256)也不会出错。最后的缘由在于在Tags中,tag_name这个字段作了一个联合惟一, 阿里云对mysql索引作了限制,索引的长度不能超过255。ubuntu

这就是一个字引起的血案。服务器

相关文章
相关标签/搜索