如何让Django兼容MySQL 5.7旧数据库?解决mysqlclient版本问题
1. 什么是mysql_config?
mysql_config是MySQL官方提供的命令行工具,主要用于输出当前系统中MySQL编译、安装环境的配置参数,包括头文件路径、库文件路径、编译选项等。像mysqlclient这类依赖MySQL C库的Python包,在编译安装时会调用它来获取编译所需的环境信息,因此它的版本直接决定了mysqlclient会链接哪个版本的MySQL底层库。
2. 为什么版本配置不一致?
你通过dpkg-reconfigure mysql-apt-config看到的是APT源中配置的MySQL版本,但mysql_config --version显示的是系统实际已安装的mysql_config工具版本。这种不一致通常由以下原因导致:
- 系统曾安装过MySQL 8.0的开发包(如
libmysqlclient-dev),即使切换了APT源的版本,旧的开发包未被卸载,导致mysql_config仍指向8.0版本。 - 系统中同时存在多个版本的mysql_config,PATH环境变量优先指向了8.0版本的工具路径。
3. 切换到5.7并安装对应版本的mysqlclient
步骤1:卸载现有相关包
# 卸载已安装的mysqlclient pip uninstall mysqlclient -y # 卸载8.0版本的MySQL开发包及配置工具 sudo apt remove libmysqlclient-dev mysql-config -y sudo apt autoremove -y
步骤2:确认并更新APT源配置
运行sudo dpkg-reconfigure mysql-apt-config,在弹出的界面中确认选择mysql-5.7,完成后更新APT缓存:
sudo apt update
步骤3:安装MySQL 5.7开发包
sudo apt install libmysqlclient-dev=5.7.* mysql-config=5.7.* -y
安装完成后,验证版本:
mysql_config --version
此时应显示5.7.x系列版本。
步骤4:重新安装mysqlclient
现在安装mysqlclient会自动链接MySQL 5.7的库:
pip install mysqlclient
若安装时出现编译错误,可先安装编译依赖:
sudo apt install python3-dev gcc -y
4. 其他兼容MySQL 5.7的方法
如果不想折腾mysql_config和mysqlclient版本,可尝试以下两种替代方案:
方式1:使用mysql-connector-python
这是MySQL官方提供的纯Python驱动,无需依赖系统的MySQL库,直接安装即可:
pip install mysql-connector-python
修改Django的settings.py数据库配置:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': '你的数据库名', 'USER': '你的用户名', 'PASSWORD': '你的密码', 'HOST': '数据库地址', 'PORT': '3306', 'OPTIONS': { 'connector': 'mysql.connector', }, } }
方式2:调整MySQL 5.7的认证插件(需数据库操作权限)
握手错误的核心原因之一是MySQL 8.0默认使用caching_sha2_password认证插件,而MySQL 5.7默认用mysql_native_password。若你有权限操作数据库,可修改用户的认证插件:
ALTER USER '你的用户名'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码'; FLUSH PRIVILEGES;
修改后,即使使用8.0版本的mysqlclient也能正常连接MySQL 5.7。
内容的提问来源于stack exchange,提问作者Mathew Neznaev

