django的orm部分错集综合
本篇文章我会持续更新,把开发中遇到的一切orm相关的问题都放在这里
mysql索引报错
使用django 的orm,数据库用的mysql,在使用makemigrations和migrate生成数据库表时,报如下错误:
Traceback (most recent call last): File "manage.py", line 15, in <module> execute_from_command_line(sys.argv) File "C:\Program Files\Python37\lib\site-packages\django\core\management\__init__.py", line 381, in execute_from _command_line utility.execute() File "C:\Program Files\Python37\lib\site-packages\django\core\management\__init__.py", line 375, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "C:\Program Files\Python37\lib\site-packages\django\core\management\base.py", line 316, in run_from_argv self.execute(*args, **cmd_options) File "C:\Program Files\Python37\lib\site-packages\django\core\management\base.py", line 353, in execute output = self.handle(*args, **options) File "C:\Program Files\Python37\lib\site-packages\django\core\management\base.py", line 83, in wrapped res = handle_func(*args, **kwargs) File "C:\Program Files\Python37\lib\site-packages\django\core\management\commands\migrate.py", line 203, in hand le fake_initial=fake_initial, File "C:\Program Files\Python37\lib\site-packages\django\db\migrations\executor.py", line 117, in migrate state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial) File "C:\Program Files\Python37\lib\site-packages\django\db\migrations\executor.py", line 147, in _migrate_all_f orwards state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial) File "C:\Program Files\Python37\lib\site-packages\django\db\migrations\executor.py", line 244, in apply_migratio n state = migration.apply(state, schema_editor) File "C:\Program Files\Python37\lib\site-packages\django\db\migrations\migration.py", line 124, in apply operation.database_forwards(self.app_label, schema_editor, old_state, project_state) File "C:\Program Files\Python37\lib\site-packages\django\db\migrations\operations\models.py", line 514, in datab ase_forwards getattr(new_model._meta, self.option_name, set()), File "C:\Program Files\Python37\lib\site-packages\django\db\backends\base\schema.py", line 360, in alter_unique_ together self.execute(self._create_unique_sql(model, columns)) File "C:\Program Files\Python37\lib\site-packages\django\db\backends\base\schema.py", line 133, in execute cursor.execute(sql, params) File "C:\Program Files\Python37\lib\site-packages\django\db\backends\utils.py", line 100, in execute return super().execute(sql, params) File "C:\Program Files\Python37\lib\site-packages\django\db\backends\utils.py", line 68, in execute return self._execute_with_wrappers(sql, params, many=False, executor=self._execute) File "C:\Program Files\Python37\lib\site-packages\django\db\backends\utils.py", line 77, in _execute_with_wrappe rs return executor(sql, params, many, context) File "C:\Program Files\Python37\lib\site-packages\django\db\backends\utils.py", line 85, in _execute return self.cursor.execute(sql, params) File "C:\Program Files\Python37\lib\site-packages\django\db\utils.py", line 89, in __exit__ raise dj_exc_value.with_traceback(traceback) from exc_value File "C:\Program Files\Python37\lib\site-packages\django\db\backends\utils.py", line 85, in _execute return self.cursor.execute(sql, params) File "C:\Program Files\Python37\lib\site-packages\django\db\backends\mysql\base.py", line 71, in execute return self.cursor.execute(query, args) File "C:\Program Files\Python37\lib\site-packages\pymysql\cursors.py", line 170, in execute result = self._query(query) File "C:\Program Files\Python37\lib\site-packages\pymysql\cursors.py", line 328, in _query conn.query(q) File "C:\Program Files\Python37\lib\site-packages\pymysql\connections.py", line 516, in query self._affected_rows = self._read_query_result(unbuffered=unbuffered) File "C:\Program Files\Python37\lib\site-packages\pymysql\connections.py", line 727, in _read_query_result result.read() File "C:\Program Files\Python37\lib\site-packages\pymysql\connections.py", line 1066, in read first_packet = self.connection._read_packet() File "C:\Program Files\Python37\lib\site-packages\pymysql\connections.py", line 683, in _read_packet packet.check_error() File "C:\Program Files\Python37\lib\site-packages\pymysql\protocol.py", line 220, in check_error err.raise_mysql_exception(self._data) File "C:\Program Files\Python37\lib\site-packages\pymysql\err.py", line 109, in raise_mysql_exception raise errorclass(errno, errval) django.db.utils.InternalError: (1071, 'Specified key was too long; max key length is 767 bytes')
解决方法
1.检查CharField字段的max_length,是否超过最大值
2.mysql修改默认编码为utf8,出现以上问题可能是mysql默认的编码是utf8mb4
使用 以下命令可以查看默认编码
到mysql的配置文件里把编码改为utf8即可,修改步骤具体百度解决
3.修改mysql默认最大索引
配置文件里修改
default-storage-engine=INNODB
innodb_large_prefix=on
4.奇葩问题解决
我遇到的问题和以上的方法都没有关系,就把定义的字段,重新审查了一遍,把choices字段,能用SmallIntergerField或者PositiveIntegerField都由之前的IntegerField改成前者两个,把CharField的max_length超过1024的字段都换成TextField,把DateTimeField能换成DateField都改成DateField。就这样,问题奇迹般的解决