django.db.utils.OperationalError: (1071, 'Specified key was too long; max key length is 767 bytes')
环境介绍
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')的更多相关文章
- django.db.utils.OperationalError: (1071, 'Specified key was too long; max key length is 767 bytes');
在使用utf8mb4字符集的情况下,如果列存在索引,那么varchar的最大长度是191 数据库版本: 在使用utf8字符集的情况下,如果列存在索引,那么varchar的最大长度是255. 在大字段上 ...
- 在执行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 ...
- django.db.utils.OperationalError: 1050解决方案
manage.py migrate时进行同步数据库时出现问题;django.db.utils.OperationalError: (1050, "Table '表名' already exi ...
- django.db.utils.OperationalError: (1045, "Access denied for user 'ODBC'@'localhost' (using password)
错误描述: 从SQLLITE数据库换为MYSQL数据库,执行 python manage.py migrate 命令时,报错:django.db.utils.OperationalError: (10 ...
- django.db.utils.OperationalError: 1045错误
django.db.utils.OperationalError: (1045, "Access denied for user 'root'@'localhost' (using pass ...
- django.db.utils.OperationalError: no such table: auth_user
关于使用django 首次创建超级管理员时,出现 django.db.utils.OperationalError: no such table: auth_user 错误 1.首先使用命 ...
- 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 ...
- django.db.utils.OperationalError: (1050, "Table '表名' already exists)解决方法
django.db.utils.OperationalError: (1050, "Table '表名' already exists)解决方法 找到解决方案,执行: python mana ...
- 解决:django.db.utils.OperationalError: unable to open database file
这是一个从GitHub上下载的,一个网站项目的源码.想要在自己的电脑上运行,期间过程相当曲折,不过至此终于是完成了. 1.安装过程: python2->virtualenv->django ...
随机推荐
- Solr分词搜索结果不准确
Solr的schema.xml默认配置分词后条件取 OR 例如:大众1.6T 系统会自动分词为 [大众] [1.6T](ps:不同分词器分词效果不同) 会搜索出包含 [大众 OR 1.6T] ...
- MyBatis 插入主键方式和返回主键
这使用的mysql数据库,下面这种方式(没有给mysql设置自动增长)是插入主键方式: <insert id="insertBook" parameterType=" ...
- 使用Git 管理heroku的项目(windows)
此过程与管理github中的项目类似,即是普通的git配置 安装 Heroku Toolbelt, 里面包含了 msygit Foreman,以及heroku的命令行界面 1.首先在heroku上新建 ...
- Android-SurfaceView生命周期
SurfaceView的生命周期,和 Activity生命周期,Service生命周期,BroadcastReceiver生命周期,等,不一样: 因为SurfaceView显示的是(视频画面,游戏画面 ...
- [Erlang25]Erlang in anger 翻译
Erlang in anger Erlang in anger 是写Learn some Erlang的帅小伙(照片真是帅死啦)写的,一共87页,可以随意下载(英文原版):http://www ...
- CDH4.1.2 集群安装配置详细过程
http://wenku.baidu.com/link?url=Wu43MFbzKH8hu7AgGfajmOr0WpRMX_gJlMDUs6pSrBK2LOJWIMpfWZa7IW-BSPko1yGl ...
- SQLServer数据库的状态一直都是正在还原
解决方案: 执行以下SQL语句 restore database [数据库名称] with recovery
- h5页面宽度设置7.5rem
function ready() { var u = navigator.userAgent; var winW = document.documentElement.clientWidth; if ...
- JavaScript 对象属性
JavaScript 对象属性 属性中的 . 和 [ ](点 和 方括号)的区别 . :取对象自身的属性值: [ ]:括号内容可以是变量: var obj = {}; obj.name = 'Twx ...
- C# 中 String 类型的详细讲解
C# 字符串(String) 在 C# 中,您可以使用字符数组来表示字符串,但更常见的做法是使用 string 关键字来声明一个字符串变量.string 关键字是 System.String 类的别名 ...