环境介绍

Django (2.1)  Python 3.5.5

mysqlclient (1.4.2.post1)

Mysql 5.6.28

RHEL 7.3

在migrate时候报错

model代码如下

class EnvironmentVariable(models.Model):
"""
环境变量表
"""
application = models.ForeignKey(Application, verbose_name="所属应用", related_name="environment_variables",
on_delete=models.CASCADE)
key = models.TextField(verbose_name="键")
value = models.TextField(verbose_name="值", null=True, blank=True)

这个表在migrate时候出现BLOB/TEXT column 'id' used in key specification without a key length"

BLOB/TEXT不能被用作索引,所以报错

于是修改key字段

key = models.CharField(max_length=255, verbose_name="键")

然后makemigration 继续migrate没问题

当修改key的 max_length

key = models.CharField(max_length=1024, verbose_name="键")

出现报错:

django.db.utils.OperationalError: (1071, 'Specified key was too long; max key length is 767 bytes')

索引用的字段长度不能大于255

发现:

表在migrate时候会添加 application_id 和key两个字段的唯一联合索引

名:paas_environmentvariable_application_id_key_0838cfb7_uniq        拦位 application_id,key  索引类型 Unique  索引方法BTREE

解决:在数据库表设计里面去掉拦位key的索引

观察了数据库里面其它用户所创建的表都是两个字段做的唯一联合索引

思考:Django model里面有个db_index=True 的参数是够可以解决停止在migrate时候把key这个字段加入索引

Django所用(傻瓜式,支持多种数据库类型)数据库操作模块在migrate索引添加机制原理分析,最好能分析源代码

参考:

https://github.com/aschn/drf-tracking/issues/29#issuecomment-264030924

https://github.com/victorx98/drf-tracking/commit/efc2350b202d78cc2db9aed2763e381bb84ccae1

有人在model加了这个

    class Meta:
unique_together = ("application", "key")

django.db.utils.OperationalError: (1071, 'Specified key was too long; max key length is 767 bytes')的更多相关文章

  1. django.db.utils.OperationalError: (1071, 'Specified key was too long; max key length is 767 bytes');

    在使用utf8mb4字符集的情况下,如果列存在索引,那么varchar的最大长度是191 数据库版本: 在使用utf8字符集的情况下,如果列存在索引,那么varchar的最大长度是255. 在大字段上 ...

  2. 在执行migrate的时候出现问题(错误见末尾): django.db.utils.OperationalError: (1045, "Access denied for user ‘ODBC‘@‘localho st‘ (using password: YES)")

    Python框架之Django的数据库 在执行migrate的时候出现问题(错误见末尾) django.db.utils.OperationalError: (1045, "Access d ...

  3. django.db.utils.OperationalError: 1050解决方案

    manage.py migrate时进行同步数据库时出现问题;django.db.utils.OperationalError: (1050, "Table '表名' already exi ...

  4. django.db.utils.OperationalError: (1045, "Access denied for user 'ODBC'@'localhost' (using password)

    错误描述: 从SQLLITE数据库换为MYSQL数据库,执行 python manage.py migrate 命令时,报错:django.db.utils.OperationalError: (10 ...

  5. django.db.utils.OperationalError: 1045错误

    django.db.utils.OperationalError: (1045, "Access denied for user 'root'@'localhost' (using pass ...

  6. django.db.utils.OperationalError: no such table: auth_user

    关于使用django 首次创建超级管理员时,出现     django.db.utils.OperationalError: no such table: auth_user   错误 1.首先使用命 ...

  7. Why getting this error “django.db.utils.OperationalError: (1050, ”Table 'someTable' already exists“)”

    0down votefavorite   I am getting error like django.db.utils.OperationalError: (1050, "Table 's ...

  8. django.db.utils.OperationalError: (1050, "Table '表名' already exists)解决方法

    django.db.utils.OperationalError: (1050, "Table '表名' already exists)解决方法 找到解决方案,执行: python mana ...

  9. 解决:django.db.utils.OperationalError: unable to open database file

    这是一个从GitHub上下载的,一个网站项目的源码.想要在自己的电脑上运行,期间过程相当曲折,不过至此终于是完成了. 1.安装过程: python2->virtualenv->django ...

随机推荐

  1. 利用NotePad++ 格式化代码(格式标准化) worldsing

    在阅读别人的代码时往往会遇到格式很乱,阅读起来很费劲,如果手动改很容易出错,而且很费时间,这时可以借助一些专业的编辑器来格式化代码,NotePad++是一个轻量级的代码编辑器,占用内存少,运行速度快, ...

  2. ramfs和tmpfs的区别

    简介 ramfs和tmpfs是在内存上建立的文件系统(Filesystem).其优点是读写速度很快,但存在掉电丢失的风险.如果一个进程的性能瓶颈是硬盘的读写,那么可以考虑在ramfs或tmpfs上进行 ...

  3. WebStorm + JetBrains IDE Support 实现自动刷新功能

    WebStorm 7.0 + live eidt + JetBrains IDE Support 实现自动刷新功能, WebStorm 7.0 已自带live eidt扩展 并可更改端口,WebSto ...

  4. handsontable-mobiles

    适配移动端:文档不完整,现在只能适配ipad4

  5. Java对象和XML转换

    有时候,我们需要把Java对象转换成XML文件.这时可以用JAXB来实现.(JDK1.6及以后的版本无需导入依赖包,因为已经包含在JDK里了) 假如某个公司有许多部门,每个部门有许多职员,我们可以这样 ...

  6. access建立sql查询语句运行查询语句

    1.打开一个Access数据库文件 2.点击“创建”标签中的“查询设计”,会弹出一个“显示表”的对话框,点击“关闭”将其关闭 3.这时会有一个名为“查询*”的窗口,还不能输入SQL语句 4.点击左上角 ...

  7. Unity3d之Coroutine

    在Unity3d中使用C#时,Coroutine是一个大有用处的好东西,至于怎么用网上多的是讲,我仅在此记录最近一次使用中的小发现. 因为某种需求,要在一个Coroutine实现中使用while循环, ...

  8. Buffer Pool--内存总结1

    物理地址空间是处理器用来访问位于总线上的所有部件的集合.在32位处理器上,地址总线为32位,寻址空间为4GB.在使用PAE的32位服务器上,地址总线为36位,寻址空间为64GB.在64位的处理器上生产 ...

  9. 【OCP-12c】CUUG 071题库考试原题及答案解析(19)

    1.choose the best answerWhat is the primary difference between the relational database (RDB) andobje ...

  10. IIS发布好的网页突然不显示图片了

    按以下步骤把地址加到ie的本地intranet就好了