使用XAMPP和Vagrant运行Django项目时执行makemigration或启动服务遭遇1045数据库访问拒绝错误的问题咨询
这个错误本质是Django没法成功连接到MySQL数据库,结合你用Vagrant+XAMPP的场景,我给你拆解几个最可能的原因:
数据库配置参数不匹配:你的Django项目
settings.py里的DATABASES配置肯定有问题。错误提示明确说了using password: NO,说明Django尝试用空密码去登录root用户,但你XAMPP里的MySQLroot用户大概率是设置了密码的(毕竟XAMPP默认会给root设密码,或者你自己配置过)。要么是你在DATABASES里没写PASSWORD字段,要么是写了但值是空字符串,导致连接时没传密码,直接被MySQL拒绝了。Vagrant虚拟机和宿主机的MySQL环境隔离:你是在Vagrant虚拟机里跑Django项目,而XAMPP的MySQL是装在你的本地宿主机上的。这时候Django里写的
localhost对虚拟机来说,指的是虚拟机自己的本地,不是你的宿主机。如果虚拟机里没装MySQL,或者虚拟机里的MySQLroot用户配置和XAMPP的不一样,自然连不上。就算你要连宿主机的MySQL,也得把数据库主机改成宿主机的IP地址(比如通常是192.168.33.1这类Vagrant默认的宿主机IP),还要确保XAMPP的MySQL允许外部IP访问(默认XAMPP的MySQL只允许localhost连接,得去改my.cnf或者my.ini里的绑定地址为0.0.0.0,还要给root用户授权允许从虚拟机IP登录)。MySQL用户权限限制:XAMPP里的MySQL
root用户默认可能只允许从localhost(也就是宿主机本身)登录,而虚拟机的IP不在允许的访问列表里。就算你密码对了,MySQL也会因为用户的host权限限制拒绝连接。这时候需要在MySQL里给root用户授权,允许从虚拟机的IP或者所有IP(用%)登录。混淆了两个MySQL环境:说不定你误以为用的是XAMPP的MySQL,但实际上Vagrant虚拟机里也安装了MySQL,而这个虚拟机里的
root用户要么没设置密码(但你配置里写了密码),要么密码和你配置的不一致,导致连接失败。这时候得先搞清楚你的Django到底要连哪个MySQL。
内容的提问来源于stack exchange,提问作者Nou

