You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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或容器内部访问,需要手动授权:

  1. 进入你的MySQL容器:
    docker exec -it what mysql -uroot -pabc123
    
  2. 在MySQL命令行中执行授权语句(允许root从192.168.99.1访问mami数据库):
    GRANT ALL PRIVILEGES ON mami.* TO 'root'@'192.168.99.1' IDENTIFIED BY 'abc123';
    FLUSH PRIVILEGES;
    
  3. 如果是开发环境,也可以临时放宽权限(允许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版本:

  1. 卸载现有pymysql:
    pip uninstall pymysql
    
  2. 指定版本安装:
    pip install pymysql==0.9.3
    
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:27:24