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

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正常连接数据库

解决方法

  1. 检查并配置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;
  1. 切换为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",
}
  1. 验证环境变量是否正确加载
    在代码中添加打印语句,确认环境变量值是否被正确读取:
fmt.Println("DBUSER:", os.Getenv("DBUSER"))
fmt.Println("DBPASS:", os.Getenv("DBPASS"))

内容的提问来源于stack exchange,提问作者YouWontBreakMySoul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 05:03:36