django中切换数据库源为mysql时的踩坑

本文记录了在Django项目中将默认的SQLite数据库切换到MySQL时遇到的问题及解决过程。问题源于Django 3.0版本与pymysql 0.9.3的不兼容,导致运行错误。解决方案包括降级Django到2.1.4或者修改源码以适应高版本Django。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题描述:

django中默认的数据是sqlite,但是我们正常使用都是mysql,所以就按照官网的教程配置修改settings.py中的数据库配置,项目初始化文件__init__.py, 如下:

1、settings.py

# DATABASES = {
#     'default': {
#         'ENGINE': 'django.db.backends.sqlite3',
#         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
#     }
# }

# 修改成mysql如下
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',    # 你的数据库名称
        'USER': 'root',   # 你的数据库用户名
        'PASSWORD': '123456',  # 你的数据库密码
        'HOST': '',  # 你的数据库主机,留空默认为localhost
        'PORT': '3306',  # 你的数据库端口
    }}

2、__init__.py

# 由于mysql默认引擎为MySQLdb,在__init__.py文件中添加下面代码
# 在python3中须替换为pymysql,可在主配置文件(和项目同名的文件下,不是app配置文件)中增加如下代码
import pymysql
pymysql.install_as_MySQLdb()
# 如果找不到pymysql板块,则通过pip install pymysql进行安装。

3、按照教程说,完成上面两步后,重新运行如下命令更新初始化数据库就可以了。

python manage.py makemigrations

python manage.py migrate

4、然而,按照如下配置后,运行报错如下:

django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?

# 等你安装pip install pymysql后,继续报错如下:
mysqlclient 1.3.3 or newer is required 。。。。

二、问题定位

1、检查了安装的django版本为3.0.6, pymysql的版本为 0.9.3

2、经过查找资料定位,发现报错的原因是django版本太高,pymysql0.9.3不支持。

三、问题解决方法

1、django降级到能支持的版本,2.1.4版本就OK了

pip install --upgrade django==2.1.4

更新版本成功后运行django刷新数据库的命令,再次启动项目,发现已经正常。

2、不去降级django版本,继续使用django3,这样的话,解决起来就相对麻烦很多了(需要修改源码)。

#找到Python环境下 django包,并进入到backends下的mysql文件夹
cd /opt/anaconda3/envs/envAGC_Mini/lib/python3.6/site-packages/django/db/backends/mysql
#文件列表如下

# 找到base.py文件,注释掉 base.py 中如下部分(35/36行)
if version < (1, 3, 3):
     raise ImproperlyConfigured("mysqlclient 1.3.3 or newer is required; you have %s" % Database.__version__)

此时仍会会报错,报错信息如下:

AttributeError: ‘str’ object has no attribute ‘decode’

#找到operations.py文件(46行,版本不同行数不同哈~自个儿find一下),将decode改为encode
#linux vim 查找快捷键:?decode
if query is not None:
    query = query.decode(errors='replace')
return query
#改为
if query is not None:
    query = query.encode(errors='replace')
return query

修改完成后,重新刷新数据库,再次启动项目,应该正常。

 

以上为查询网上资料后总结的方法,只作为个人参考~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值