Golang连接本地MySQL报错:Access denied for user 'root'@'localhost'
使用Golang访问数据库时出现权限错误
我按照Golang官方数据库访问示例连接本地MySQL数据库,代码如下:
func main() { // Capture connection properties. cfg := mysql.Config{ User: os.Getenv("DBUSER"), Passwd: os.Getenv("DBPASS"), Net: "tcp", Addr: "127.0.0.1:3306", DBName: "someDB", } // Get a database handle. var err error db, err = sql.Open("mysql", cfg.FormatDSN()) if err != nil { log.Fatal(err) } pingErr := db.Ping() if pingErr != nil { log.Fatal(pingErr) } fmt.Println("Connected!") }
运行代码后返回如下错误:
✗ go run main.go 2023/02/17 00:10:35 Error 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
已尝试的操作:
- 确认环境变量
DBUSER和DBPASS已设置为预期值 - 可以通过
mysql -u root -p正常连接数据库
解决方法
- 检查并配置MySQL用户的主机权限
MySQL用户权限与主机绑定,root@localhost(通过socket连接)和root@127.0.0.1(通过TCP连接)是两个独立的用户。你通过mysql -u root -p登录的是root@localhost,但代码用TCP连接对应root@127.0.0.1,该用户可能无权限或密码不匹配。
执行SQL查看现有用户:
SELECT user, host FROM mysql.user;
若不存在root@127.0.0.1,创建并授权:
CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY '你的数据库密码'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION; FLUSH PRIVILEGES;
- 切换为Socket连接方式
若不想修改MySQL用户权限,可将代码中的连接方式改为Socket,适配localhost用户:
cfg := mysql.Config{ User: os.Getenv("DBUSER"), Passwd: os.Getenv("DBPASS"), Net: "unix", Addr: "/var/run/mysqld/mysqld.sock", // Linux/macOS路径,Windows为`\\.\pipe\MySQL` DBName: "someDB", }
- 验证环境变量是否正确加载
在代码中添加打印语句,确认环境变量值是否被正确读取:
fmt.Println("DBUSER:", os.Getenv("DBUSER")) fmt.Println("DBPASS:", os.Getenv("DBPASS"))
内容的提问来源于stack exchange,提问作者YouWontBreakMySoul
相关产品推荐
相关产品推荐

