django orm 错集综合

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。就这样,问题奇迹般的解决

猜你喜欢

转载自www.cnblogs.com/yangva/p/10637970.html