问题背景
在Django项目中连接MySQL数据库时,经常会遇到SSL证书验证失败的问题。特别是当MySQL运行在Docker容器中时,这个问题更为常见。
环境说明
- Django项目
- MySQL 8.0 (Docker容器)
- Python 3.x
常见错误
django.db.utils.OperationalError: (2026, 'TLS/SSL error: Server certificate validation failed. A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider. Error 0x800B0109(CERT_E_UNTRUSTEDROOT)')
这个错误表明Django在连接MySQL数据库时,TLS/SSL连接的证书验证失败。原因是MySQL服务器使用的SSL证书不是由受信任的证书机构签发的。
解决方案
1. 安装必要的包
pip install pymysql
2. 修改Django项目配置
在项目的settings.py
文件开头添加以下代码:
import pymysql
pymysql.version_info = (1, 4, 6, "final", 0)
pymysql.install_as_MySQLdb()
3. 配置数据库连接
在settings.py
中配置数据库连接:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'your_database_name',
'USER': 'your_username',
'PASSWORD': 'your_password',
'HOST': 'your_host',
'PORT': 'your_port'
}
}
4. Docker中的MySQL配置
如果你的MySQL运行在Docker容器中,确保正确配置容器:
# 运行MySQL容器
docker run -d \
--name mysql \
-p 3310:3306 \
-e MYSQL_ROOT_PASSWORD=your_password \
mysql:8.0
5. 创建数据库
连接到MySQL并创建数据库:
mysql -h your_host -P your_port -u your_username -p
CREATE DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
6. 应用数据库迁移
python manage.py migrate
故障排除
1. 检查MySQL容器状态
# 查看容器状态
docker ps | grep mysql
# 查看容器日志
docker logs mysql
2. 检查数据库连接
# 测试数据库连接
mysql -h your_host -P your_port -u your_username -p
评论区