使用Golang GORM连接MySQL时出现1045访问拒绝错误求助
解决Gorm连接MySQL时的1045权限错误
以下是针对你遇到的Error 1045: Access denied for user 'root'@'localhost' (using password: YES)问题的几种排查和解决方法:
1. 修正DSN的占位符问题
你的代码中DSN里的<root>和<password>是占位符,必须替换成真实的用户名和密码,且不能保留尖括号。比如你的root密码是mypassword123,正确的DSN应该是:
dsn := "root:mypassword123@/simplerest?charset=utf8&parseTime=True&loc=Local"
如果密码包含特殊字符(如@、#、&等),需要进行URL编码,例如密码是pass@123,要写成pass%40123。
2. 指定连接协议(匹配终端的连接方式)
终端执行mysql -u root -p默认使用Unix Socket连接,而Gorm默认可能尝试TCP/IP连接,两者的认证规则可能不同。你可以在DSN中明确指定连接方式:
- 使用TCP/IP连接:
dsn := "root:yourpassword@tcp(localhost:3306)/simplerest?charset=utf8&parseTime=True&loc=Local"
- 使用Unix Socket连接(需替换为你的MySQL Socket实际路径,常见路径:Ubuntu是
/var/run/mysqld/mysqld.sock,Mac是/tmp/mysql.sock):
dsn := "root:yourpassword@unix(/var/run/mysqld/mysqld.sock)/simplerest?charset=utf8&parseTime=True&loc=Local"
3. 确认目标数据库已存在
DSN中的simplerest数据库必须提前创建,登录MySQL终端执行以下命令确认:
CREATE DATABASE IF NOT EXISTS simplerest;
4. 验证root用户的访问权限
即使终端能登录,root用户可能仅被允许通过Socket访问,而非TCP/IP?登录MySQL后执行以下命令查看用户权限:
SELECT user, host FROM mysql.user WHERE user='root';
如果root的host仅为localhost,可以执行以下命令授权其访问目标数据库(替换为你的密码):
GRANT ALL PRIVILEGES ON simplerest.* TO 'root'@'localhost' IDENTIFIED BY 'yourpassword'; FLUSH PRIVILEGES;
5. 修复代码逻辑问题
你的代码中log.Fatal("Connection established")会在连接成功后直接终止程序,导致后续的db = d无法执行,建议改为:
log.Println("Connection established")
内容的提问来源于stack exchange,提问作者R.Vatsa
相关产品推荐
相关产品推荐

