Ubuntu下Django配置MySQL遇Table already exists错误的解决求助
问题描述
在Ubuntu 18.04系统上运行Python 3.6环境下的Django 3.2,尝试将数据库配置为MySQL 5.7.41。执行命令python manage.py migrate --run-syncdb时,出现错误:
django.db.utils.OperationalError: (1050, "Table 'myapp_mymodel' already exists")
当前迁移状态如下:
admin [X] 0001_initial [X] 0002_logentry_remove_auto_add [X] 0003_logentry_add_action_flag_choices auth [X] 0001_initial [X] 0002_alter_permission_name_max_length [X] 0003_alter_user_email_max_length [X] 0004_alter_user_username_opts [X] 0005_alter_user_last_login_null [X] 0006_require_contenttypes_0002 [X] 0007_alter_validators_add_error_messages [X] 0008_alter_user_username_max_length [X] 0009_alter_user_last_name_max_length [X] 0010_alter_group_name_max_length [X] 0011_update_proxy_permissions [X] 0012_alter_user_first_name_max_length contenttypes [X] 0001_initial [X] 0002_remove_content_type_name myapp [ ] 0001_initial [ ] 0002_alter_user_uid sessions [ ] 0001_initial
解决方案
核心原因
MySQL数据库中已存在myapp_mymodel表,但Django迁移记录未标记myapp的初始迁移完成,导致migrate命令尝试重复创建表。通常由手动导入数据、迁移中断或数据库残留数据引发。
具体解决步骤
方法一:标记迁移为已完成(推荐,保留现有数据)
- 提前确认数据库表结构与
myapp迁移文件定义一致,避免后续数据不一致。 - 执行命令标记
myapp的初始迁移完成:
python manage.py migrate --fake myapp 0001_initial
- 若有后续迁移(如
0002_alter_user_uid),同样标记:
python manage.py migrate --fake myapp 0002_alter_user_uid
- 最后执行正常迁移,处理剩余未完成的app(如sessions):
python manage.py migrate
方法二:清空数据库重新迁移(数据全丢,仅适用于测试环境)
- 登录MySQL,删除并重建目标数据库:
DROP DATABASE your_database_name; CREATE DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- 退出MySQL后执行完整迁移:
python manage.py migrate
- 如需导入历史数据,确保数据是从SQLite导出的无残留表结构的干净数据。
方法三:删除重复表后重新迁移
- 登录MySQL,删除重复的
myapp_mymodel表:
DROP TABLE myapp_mymodel;
- 执行正常迁移命令:
python manage.py migrate
内容的提问来源于stack exchange,提问作者Randusr
相关产品推荐
相关产品推荐

