问题背景

在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