Django连接MySQL时出现Access Denied错误,求解决建议
Django连接MySQL时出现Access Denied错误的排查与解决建议
在新建Django项目中替换默认sqlite3为MySQL连接,运行python manage.py runserver时触发Access Denied错误,Django提示用户名或密码错误,但相同账号密码可正常登录MySQL命令行,且Python控制台用pymysql能成功连接。
相关背景
- 系统:Ubuntu22.04
- Python版本:3.9
- 使用
pymysql替代mysqlclient,已完成两处配置:- 初始化pymysql(代码放置于项目根目录
__init__.py):import pymysql pymysql.version_info=(1,4,3,"final",0) pymysql.install_as_MySQLdb() - 在
settings.py中配置了MySQL连接信息(对应MySQL命令行及settings.py配置截图)
- 初始化pymysql(代码放置于项目根目录
已验证的测试结果
在Python控制台使用相同连接参数可正常连接MySQL:
>>> import pymysql >>> conn = pymysql.connect( ... host='localhost', ... user='test', ... password = "test", ... db='xxx', ... ) >>> conn <pymysql.connections.Connection object at 0x7f065c51ebe0> >>> cur = conn.cursor() >>> cur <pymysql.cursors.Cursor object at 0x7f065ccd0ee0> >>> cur.execute("select @@version") 1 >>> output = cur.fetchall() >>> print(output) (('8.0.32-0ubuntu0.22.04.2',),) >>> conn.close()
排查与解决建议
- 检查
settings.py连接配置细节:- 确认
HOST设置为'localhost'而非'127.0.0.1'——MySQL对localhost采用socket连接,127.0.0.1采用TCP/IP连接,两种方式的权限规则可能不同 - 检查密码是否含特殊字符,在
settings.py中是否用引号正确包裹,避免转义导致密码不匹配 - 确认
USER和PASSWORD的大小写与MySQL账号完全匹配(MySQL账号大小写敏感性取决于系统配置)
- 确认
- 验证MySQL账号的连接权限:
登录MySQL命令行,执行以下语句查看账号权限范围:
若账号SELECT user, host FROM mysql.user WHERE user='test';test对应的host不包含localhost,执行以下命令授权并刷新权限:GRANT ALL PRIVILEGES ON xxx.* TO 'test'@'localhost'; FLUSH PRIVILEGES; - 检查pymysql初始化配置:
确保初始化代码放在项目根目录的__init__.py中,避免Django启动时未加载该配置
调整pymysql.version_info为实际安装的pymysql版本(可通过pip show pymysql查看Version字段),比如实际版本为1.0.2时,设置为(1,0,2,"final",0) - 清除Django缓存:
执行python manage.py flush清除缓存,或删除项目根目录下的__pycache__文件夹,避免旧配置残留
内容的提问来源于stack exchange,提问作者shijie xu
相关产品推荐
相关产品推荐

