Docker部署MySQL可通过Workbench连接但Django连接失败求助
解决Django连接Docker MySQL时的1045访问拒绝问题
先看你的错误核心:django.db.utils.OperationalError: (1045, "Access denied for user 'root'@'192.168.99.1' (using password: NO)"),这里的**using password: NO是关键信号**——要么Django没正确传递密码,要么MySQL的root用户不允许从你的主机IP(192.168.99.1)访问。结合你的Windows+Python3.6环境,我整理了一步步排查修复的方案:
1. 先排查Django配置的细节
- 验证密码配置的有效性:有时候配置文件里的密码可能被环境变量覆盖,或者存在隐形空格。你可以临时在项目里打印配置值确认:
运行后如果输出不是from django.conf import settings print(settings.DATABASES['default']['PASSWORD'])abc123,说明配置没正确加载,检查settings.py的路径或者是否有其他配置文件覆盖了它。 - 修正
PORT字段类型:你当前写的是字符串'3306',虽然Django能自动转换,但改成整数3306更稳妥,避免潜在的类型解析问题:DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mami', 'USER': 'root', 'PASSWORD': 'abc123', 'HOST': '192.168.99.100', 'PORT': 3306, # 改为整数类型 } }
2. 修复MySQL用户的访问权限
错误里显示的客户端IP是192.168.99.1,这是Windows下Docker Toolbox主机的默认IP(你的Workbench连接时用的是容器IP192.168.99.100,但MySQL会记录发起请求的真实主机IP)。Docker默认启动的MySQL中,root用户通常只允许从localhost或容器内部访问,需要手动授权:
- 进入你的MySQL容器:
docker exec -it what mysql -uroot -pabc123 - 在MySQL命令行中执行授权语句(允许root从
192.168.99.1访问mami数据库):GRANT ALL PRIVILEGES ON mami.* TO 'root'@'192.168.99.1' IDENTIFIED BY 'abc123'; FLUSH PRIVILEGES; - 如果是开发环境,也可以临时放宽权限(允许root从任何IP访问,生产环境绝对禁止这么做):
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'abc123'; FLUSH PRIVILEGES;
3. 确保pymysql与Python/Django版本兼容
你用的是Python3.6,过高版本的pymysql可能和旧版Django/Python不兼容,建议安装经过验证的0.9.x版本:
- 卸载现有pymysql:
pip uninstall pymysql - 指定版本安装:
pip install pymysql==0.9.3 - 确认替换MySQLdb的代码位置:把这两行代码放在项目根目录的
__init__.py文件里,而不是只放在settings.py中,确保Django启动时能正确加载替换逻辑:# 项目根目录/__init__.py import pymysql pymysql.install_as_MySQLdb()
4. 用pymysql直接测试连接(排除Django问题)
先跳过Django,直接用pymysql测试连接,确认网络和MySQL权限没问题:
import pymysql try: conn = pymysql.connect( host='192.168.99.100', port=3306, user='root', password='abc123', db='mami' ) print("连接成功!") conn.close() except Exception as e: print(f"连接失败:{e}")
如果这个测试能成功,那问题就在Django的配置加载上;如果失败,继续排查MySQL权限或Docker端口映射。
内容的提问来源于stack exchange,提问作者zelenov aleksey
相关产品推荐
相关产品推荐

