You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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命令尝试重复创建表。通常由手动导入数据、迁移中断或数据库残留数据引发。

具体解决步骤

方法一:标记迁移为已完成(推荐,保留现有数据)

  1. 提前确认数据库表结构与myapp迁移文件定义一致,避免后续数据不一致。
  2. 执行命令标记myapp的初始迁移完成:
python manage.py migrate --fake myapp 0001_initial
  1. 若有后续迁移(如0002_alter_user_uid),同样标记:
python manage.py migrate --fake myapp 0002_alter_user_uid
  1. 最后执行正常迁移,处理剩余未完成的app(如sessions):
python manage.py migrate

方法二:清空数据库重新迁移(数据全丢,仅适用于测试环境)

  1. 登录MySQL,删除并重建目标数据库:
DROP DATABASE your_database_name;
CREATE DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  1. 退出MySQL后执行完整迁移:
python manage.py migrate
  1. 如需导入历史数据,确保数据是从SQLite导出的无残留表结构的干净数据。

方法三:删除重复表后重新迁移

  1. 登录MySQL,删除重复的myapp_mymodel表:
DROP TABLE myapp_mymodel;
  1. 执行正常迁移命令:
python manage.py migrate

内容的提问来源于stack exchange,提问作者Randusr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 09:02:53