Django 2.0如何对接已存有数据的现有MySQL数据库?
我之前在基于Django 2.0开发项目时,刚好也碰到过要复用已有MySQL数据库的需求,踩过几个小坑,给你整理一套完整的操作流程,确保能顺利搞定:
复用现有MySQL数据库到Django 2.0项目的完整步骤
1. 先配置数据库连接
首先得确保你的Django项目已经正确对接上目标MySQL数据库,找到项目根目录下的settings.py,修改DATABASES配置块:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': '你的目标数据库名', 'USER': '数据库登录用户名', 'PASSWORD': '数据库登录密码', 'HOST': 'localhost', # 若数据库在远程服务器,替换为对应IP 'PORT': '3306', } }
注意:记得先安装MySQL驱动,Django 2.0推荐用mysqlclient,执行命令pip install mysqlclient即可。
2. 自动生成模型文件
用你提到的命令读取现有数据库的表结构,自动生成对应的Django模型:
python manage.py inspectdb > models.py
执行完后,你的应用目录下就会生成一个models.py文件,文件顶部会有官方提示的清理指引。
3. 手动清理生成的模型文件
这一步是核心,自动生成的文件有不少需要调整的地方,按照提示逐一处理:
- 去掉模型
Meta类里的managed = False(如果希望后续让Django管理这些表的迁移;要是想完全保留原有表的自主管理,也可以保留这个参数) - 给每个模型添加
verbose_name和verbose_name_plural,方便在Django后台管理时识别 - 检查外键字段:Django 2.0要求外键必须指定
on_delete参数,比如on_delete=models.CASCADE或on_delete=models.SET_NULL等,自动生成的外键可能缺省这个参数,需要补上 - 删除掉数据库里无关的系统表、测试表对应的模型代码
- 确认主键字段:如果数据库表的主键不是默认的
id,要给对应字段加上primary_key=True属性
举个简单的调整示例:
生成的原始模型可能是这样:
class OldCustomer(models.Model): customer_name = models.CharField(max_length=100) phone = models.CharField(max_length=20) class Meta: managed = False db_table = 'old_customer_list'
清理调整后可以改成:
class OldCustomer(models.Model): customer_name = models.CharField(max_length=100, verbose_name='客户姓名') phone = models.CharField(max_length=20, verbose_name='联系电话') class Meta: verbose_name = '旧系统客户' verbose_name_plural = '旧系统客户' db_table = 'old_customer_list'
4. 初始化迁移记录
因为数据库表已经存在,不能直接执行常规的迁移命令创建表,需要告诉Django这些表已经存在:
python manage.py makemigrations python manage.py migrate --fake-initial
--fake-initial参数会让Django标记这些迁移为已执行,不会去重复创建现有表。
5. 验证配置是否成功
启动Django Shell测试模型能否正常读取现有数据:
python manage.py shell
在Shell中执行:
from 你的应用名.models import OldCustomer print(OldCustomer.objects.all())
如果能正常输出数据库里的现有记录,就说明整个流程配置成功了。
内容的提问来源于stack exchange,提问作者jhon1946
相关产品推荐
相关产品推荐

