如何将Django应用整合至PHP应用创建的现有SQL数据库?
Django 整合现有PHP创建的MySQL数据库
你手里的现有数据库是MySQL(从SQL Dump里的MyISAM引擎和phpMyAdmin信息可判断),下面是具体的整合步骤:
1. 修改Django数据库配置
打开项目根目录的settings.py,找到DATABASES配置块,替换为MySQL的连接信息,示例如下:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'bincomphptest', # 对应SQL里的数据库名 'USER': '你的MySQL用户名', 'PASSWORD': '你的MySQL密码', 'HOST': 'localhost', # 对应SQL里的Host配置 'PORT': '3306', 'OPTIONS': { 'charset': 'latin1', # 匹配SQL里的表字符集 }, } }
注意:需要先安装MySQL驱动,执行pip install mysqlclient;若为Python3.10+版本,可改用pip install mysql-connector-python
2. 生成/编写对应数据库表的Model
方法一:自动生成(推荐)
Django自带的inspectdb命令可直接读取现有数据库结构,生成对应的Model代码。在项目根目录执行:
python manage.py inspectdb
命令会输出所有表的Model代码,找到agentname表对应的部分,复制到目标app下的models.py中,生成的代码大致如下:
from django.db import models class Agentname(models.Model): name_id = models.AutoField(primary_key=True) firstname = models.CharField(max_length=255) lastname = models.CharField(max_length=255) email = models.CharField(max_length=255, blank=True, null=True) phone = models.CharField(max_length=13) pollingunit_uniqueid = models.IntegerField() class Meta: managed = False # 告诉Django不要管理该表的创建/修改 db_table = 'agentname'
方法二:手动编写
若自动生成的代码有偏差,可对照SQL表结构手动编写Model,注意字段类型对应:
name_id为自增主键,用AutoField(primary_key=True)firstname/lastname是必填的varchar(255),用CharField(max_length=255)email为可选字段,需添加blank=True, null=Truephone是char(13),用CharField(max_length=13)pollingunit_uniqueid是int(11),用IntegerField()
必须在Meta类中设置managed=False和db_table='agentname',避免Django误操作现有表。
3. 让Django识别现有表
由于表已存在,不能直接执行makemigrations和migrate创建表,需执行以下命令让Django标记这些表已完成迁移:
python manage.py migrate --fake-initial
若仅针对单个app,可指定app名:
python manage.py migrate --fake-initial 你的app名称
4. 测试数据读写
打开Django Shell验证是否能正常访问数据:
python manage.py shell
在Shell中执行:
from 你的app名称.models import Agentname # 查询所有数据 agents = Agentname.objects.all() for agent in agents: print(agent.firstname, agent.lastname)
若能正常输出数据,说明整合成功。
附你提供的现有agentname表结构:
-- Table structure for table `agentname` DROP TABLE IF EXISTS `agentname`; CREATE TABLE IF NOT EXISTS `agentname` ( `name_id` int(11) NOT NULL AUTO_INCREMENT, `firstname` varchar(255) NOT NULL, `lastname` varchar(255) NOT NULL, `email` varchar(255) DEFAULT NULL, `phone` char(13) NOT NULL, `pollingunit_uniqueid` int(11) NOT NULL, PRIMARY KEY (`name_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
内容的提问来源于stack exchange,提问作者Ayatoo
相关产品推荐
相关产品推荐

