将 latin1_swedish_ci 更改为 utf8_general_ci 后无法迁移数据库

After changed latin1_swedish_ci to utf8_general_ci can't migrate db

昨天我删除了我的数据库表,因为我需要将 latin1_swedish_ci 更改为 utf8_general_ci 以便在我的应用程序中使用波兰语。在那之后我不能完全迁移我的数据库,因为我有这样的问题:

    (venv) C:\netbast\fastandbeauty\project>manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, comments, contenttypes, registration, sessions, social_django, user_content, user_profile
Running migrations:
  Applying social_django.0005_auto_20160727_2333...Traceback (most recent call last):
  File "C:\netbast\fastandbeauty\venv\lib\site-packages\django\db\backends\utils.py", line 65, in execute
    return self.cursor.execute(sql, params)
  File "C:\netbast\fastandbeauty\venv\lib\site-packages\django\db\backends\mysql\base.py", line 101, in execute
    return self.cursor.execute(query, args)
  File "C:\netbast\fastandbeauty\venv\lib\site-packages\MySQLdb\cursors.py", line 250, in execute
    self.errorhandler(self, exc, value)
  File "C:\netbast\fastandbeauty\venv\lib\site-packages\MySQLdb\connections.py", line 50, in defaulterrorhandler
    raise errorvalue
  File "C:\netbast\fastandbeauty\venv\lib\site-packages\MySQLdb\cursors.py", line 247, in execute
    res = self._query(query)
  File "C:\netbast\fastandbeauty\venv\lib\site-packages\MySQLdb\cursors.py", line 411, in _query
    rowcount = self._do_query(q)
  File "C:\netbast\fastandbeauty\venv\lib\site-packages\MySQLdb\cursors.py", line 374, in _do_query
    db.query(q)
  File "C:\netbast\fastandbeauty\venv\lib\site-packages\MySQLdb\connections.py", line 292, in query
    _mysql.connection.query(self, query)
_mysql_exceptions.OperationalError: (1071, 'Specified key was too long; max key length is 1000 bytes')

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\netbast\fastandbeauty\project\manage.py", line 22, in <module>
    execute_from_command_line(sys.argv)
  File "C:\netbast\fastandbeauty\venv\lib\site-packages\django\core\management\__init__.py", line 363, in execute_from_command_line
    utility.execute()
  File "C:\netbast\fastandbeauty\venv\lib\site-packages\django\core\management\__init__.py", line 355, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "C:\netbast\fastandbeauty\venv\lib\site-packages\django\core\management\base.py", line 283, in run_from_argv
    self.execute(*args, **cmd_options)
  File "C:\netbast\fastandbeauty\venv\lib\site-packages\django\core\management\base.py", line 330, in execute
    output = self.handle(*args, **options)
  File "C:\netbast\fastandbeauty\venv\lib\site-packages\django\core\management\commands\migrate.py", line 204, in handle
    fake_initial=fake_initial,
  File "C:\netbast\fastandbeauty\venv\lib\site-packages\django\db\migrations\executor.py", line 115, in migrate
    state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial)
  File "C:\netbast\fastandbeauty\venv\lib\site-packages\django\db\migrations\executor.py", line 145, in _migrate_all_forwards
    state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
  File "C:\netbast\fastandbeauty\venv\lib\site-packages\django\db\migrations\executor.py", line 244, in apply_migration
    state = migration.apply(state, schema_editor)
  File "C:\netbast\fastandbeauty\venv\lib\site-packages\django\db\migrations\migration.py", line 129, in apply
    operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
  File "C:\netbast\fastandbeauty\venv\lib\site-packages\django\db\migrations\operations\models.py", line 536, in database_forwards
    getattr(new_model._meta, self.option_name, set()),
  File "C:\netbast\fastandbeauty\venv\lib\site-packages\django\db\backends\base\schema.py", line 353, in alter_unique_together
    self.execute(self._create_unique_sql(model, columns))
  File "C:\netbast\fastandbeauty\venv\lib\site-packages\django\db\backends\base\schema.py", line 120, in execute
    cursor.execute(sql, params)
  File "C:\netbast\fastandbeauty\venv\lib\site-packages\django\db\backends\utils.py", line 80, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "C:\netbast\fastandbeauty\venv\lib\site-packages\django\db\backends\utils.py", line 65, in execute
    return self.cursor.execute(sql, params)
  File "C:\netbast\fastandbeauty\venv\lib\site-packages\django\db\utils.py", line 94, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "C:\netbast\fastandbeauty\venv\lib\site-packages\django\utils\six.py", line 685, in reraise
    raise value.with_traceback(tb)
  File "C:\netbast\fastandbeauty\venv\lib\site-packages\django\db\backends\utils.py", line 65, in execute
    return self.cursor.execute(sql, params)
  File "C:\netbast\fastandbeauty\venv\lib\site-packages\django\db\backends\mysql\base.py", line 101, in execute
    return self.cursor.execute(query, args)
  File "C:\netbast\fastandbeauty\venv\lib\site-packages\MySQLdb\cursors.py", line 250, in execute
    self.errorhandler(self, exc, value)
  File "C:\netbast\fastandbeauty\venv\lib\site-packages\MySQLdb\connections.py", line 50, in defaulterrorhandler
    raise errorvalue
  File "C:\netbast\fastandbeauty\venv\lib\site-packages\MySQLdb\cursors.py", line 247, in execute
    res = self._query(query)
  File "C:\netbast\fastandbeauty\venv\lib\site-packages\MySQLdb\cursors.py", line 411, in _query
    rowcount = self._do_query(q)
  File "C:\netbast\fastandbeauty\venv\lib\site-packages\MySQLdb\cursors.py", line 374, in _do_query
    db.query(q)
  File "C:\netbast\fastandbeauty\venv\lib\site-packages\MySQLdb\connections.py", line 292, in query
    _mysql.connection.query(self, query)
django.db.utils.OperationalError: (1071, 'Specified key was too long; max key length is 1000 bytes')

我不知道我能做什么,因为我是学徒。我找到了答案,但对我没有帮助。

抱歉我的英语不好。

PS。当我启动服务器时它运行,但 social-django 不工作。只有那个应用无法迁移。

祝一切顺利, 丁森

免责声明:我不是这方面的专家,我只是陈述我目前的做法,这里的建议只是建议 最终你决定是否要使用它。

让我们尝试解决问题,在您的终端中输入:

  • mysql -u root
  • 然后在您进入 mysql 监视器后,您可以通过输入 SHOW_DATABASE;
  • 检查您的 fastandbeauty 数据库是否仍然存在
  • 如果数据库还在,用 DROP DATABASE fastandbeauty;
  • 删除它
  • 然后通过键入 CREATE SCHEMA fastandbeauty DEFAULT CHARACTER SET utf8 重新创建并创建一个新的新数据库,如果一切正常,监视器应该省略一条消息 Query OK, 1 row affected (0.00 sec),之后您可以再次键入 SHOW_DATABASE 和查看数据库是否存在
  • 通过键入 \q
  • 离开 mysql monitor
  • 那么你可以python manage.py migrate

应该会创建一个新的 fastandbeauty database,您可以继续处理它。

现在一些未来的参考:

我建议您不要在本地生产中使用您的开发数据库,​​这样您就不会遇到需要手动 create/delete 您的数据库的情况。

因此您可以 dump 将您的数据放入一个文件中,您可以使用该文件存储一些数据以供本地开发。如何使用它?

那么你可以创建新的 git branch 并将其命名为 local-dev-task-12,这样你将来会在这个分支上工作,然后你可以只为这个分支创建新的数据库并调用数据库 fast_and_beauty12,只需执行我已准备好在 migrationcd 之前解释的步骤,将其放入您保存 dump file 的文件夹中,首先:

  • mysql -u root -p fast_and_beauty_12 < DumpFastAndBeauty.sql - 这会将您的数据转储到新的 fast_and_beauty_12 创建的数据库中
  • 进入您的 setting db 文件并将数据库名称更改为您创建的新数据库名称,这样 fastandbeauty >> fast_and_beauty12 这样您就可以使用它了
  • 然后你去做python manage migrate.py

有了这个,您将拥有一个新的 git branch 数据库,您可以在您的数据库上工作,而不必担心对 dev 数据库造成伤害。

注意:

您不会从该分支提交新的 migration 文件,因为这会使事情变糟,您会 git stash。他们为未来的工作。

在你隐藏 migrations 文件后回到 setting.py 并把你的名字 local database 改成你的 development database 名字所以 fast_and_beauty12fastandbeauty,将新更改迁移到 development branch,您可以

python manage.py migrate,这样应该会用新数据填充您 development database

这个想法是每次为本地开发创建新分支时都有新的工作数据库,一开始有点混乱,但一段时间后你会理解它,并开始更频繁地这样做。如果您不打算在数据库上工作,则可能不需要这样做,但我仍然认为这是一个很好的做法。

我现在没有问题。你能做些什么来解决它?

您需要转到 my.ini(SQL 中的配置文件)并更改 MYISAM

default_tmp_storage_engine=MYISAM

default-storage-engine=InnoDB

感谢大家的帮助!