如何解决运行manage.py时的语法错误及MariaDB驱动依赖报错
故障背景
此前可正常运行的搭载MariaDB的Django应用,项目搁置一段时间后重启无法定位故障。运行环境未使用venv虚拟环境,系统同时存在两套Python环境:Python 2.7配套Django 1.11、Python 3(实际部署版本为3.6)配套Django 2.2.7,已无法回忆起项目最初适配的环境版本。
分阶段报错记录
- 执行默认
python manage.py makemigrations(即调用Python2.7解释器)时的报错:
校验当前manage.py内容为Django标准生成文件,本身不存在语法错误。File "manage.py", line 16 ) from exc ^ SyntaxError: invalid syntax - 切换为Python3解释器运行manage.py时的数据库连接类报错:
核心错误链路为:- 加载MySQLdb(mysqlclient驱动)时触发
ImportError: libmariadbclient.so.18: cannot open shared object file: No such file or directory - 最终抛出Django配置异常:
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module. Did you install mysqlclient?
- 加载MySQLdb(mysqlclient驱动)时触发
- 已尝试但未生效的操作:按官方指南完全卸载重装MariaDB、社区方案中提及的安装pymysql操作,均未解决问题。
核心根因定位
- Python2下的SyntaxError本质:manage.py中使用的
raise ... from exc是Python 3.3版本才引入的异常链语法,Python2.7完全不支持该语法结构。用Python2解释器解析这个面向Python3的manage.py文件时,自然会在遇到对应代码行时直接抛出语法错误,和文件本身是否损坏没有关系。 - libmariadbclient.so.18缺失的本质:当前系统安装的mysqlclient包是早期针对MariaDB 10.4及更早版本编译的,硬编码依赖MariaDB客户端库的
libmariadbclient.so.18动态文件;重装后的新版MariaDB(10.5及以上版本)已经重构了客户端库命名规则,对应动态库文件为libmariadb.so.3,文件名、存储路径和旧版完全不匹配,mysqlclient加载时自然找不到指定文件,触发依赖缺失错误。 - 安装pymysql未生效的本质:仅通过pip安装pymysql包无法让Django正常调用该驱动——Django默认只会加载符合MySQLdb接口规范的驱动,没有额外兼容映射配置的话,Django根本不会识别pymysql,自然还是会报找不到MySQLdb的错误。
落地解决步骤
- 第一步:统一解释器版本,规避语法错误
- 后续所有Django操作全部使用
python3 manage.py执行,不要再用默认的python命令,避免Python2.7解释器解析Python3语法文件的问题。 - 先验证环境匹配度:执行
python3 -c "import django; print(django.get_version())",确认输出为2.2.7,说明当前Python3环境的Django版本和项目匹配。
- 后续所有Django操作全部使用
- 第二步:解决MariaDB客户端库依赖问题
- 清理系统中版本不匹配的旧mysqlclient:执行
pip3 uninstall mysqlclient -y,彻底删除之前编译的、依赖旧版MariaDB客户端库的驱动。 - 安装当前MariaDB版本对应的开发依赖包
libmariadb-dev,提供编译mysqlclient需要的头文件和动态库文件。 - 重新安装匹配当前库版本的mysqlclient:执行
pip3 install mysqlclient,编译过程会自动识别当前系统的MariaDB动态库路径,不会再出现查找旧版so文件的问题。
- 清理系统中版本不匹配的旧mysqlclient:执行
- 第三步:若mysqlclient重新安装仍编译失败,修正pymysql兼容方案
- 安装pymysql:执行
pip3 install pymysql,注意选择1.0.0及以上版本,可直接通过Django2.2的驱动版本校验,无需手动修改Django源码。 - 在项目根目录的manage.py文件最顶部(所有import语句之前)添加兼容映射代码:
import pymysql pymysql.install_as_MySQLdb() - 完成配置后,Django即可自动通过pymysql接口连接MariaDB,不会再触发MySQLdb的加载报错。
- 安装pymysql:执行
- 第四步:验证修复效果
- 先测试数据库连通性:执行
python3 manage.py dbshell,能正常进入MariaDB命令行即说明驱动层配置正常。 - 再依次执行
python3 manage.py makemigrations、python3 manage.py migrate,确认所有迁移操作可正常完成。
- 先测试数据库连通性:执行
内容的提问来源于stack exchange,提问作者Cm1602
相关产品推荐
相关产品推荐

