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

Golang API无法连接MySQL数据库 报错连接被拒绝且数据库已关闭

问题根源

两个报错为因果关系:

  1. 首个报错dial tcp [::1]:3306: connect: connection refused是因为系统将localhost解析为IPv6的环回地址::1,但你的MySQL服务没有监听IPv6的3306端口。你本地执行mysql -uroot能正常连接,是因为默认走Unix套接字通信,没有走TCP协议,所以不受监听地址影响。
  2. 后续panic: sql: database is closed是因为你的代码在数据库连接失败后仅打印了错误,没有终止程序执行,后续仍然调用Config.DB.AutoMigrate操作空的数据库实例,同时defer Config.DB.Close()尝试关闭空连接也会触发panic。
修复步骤

1. 修复地址解析问题

修改Config/Database.go中BuildDBConfig函数的Host字段,将localhost改为127.0.0.1强制走IPv4协议:

func BuildDBConfig() *DBConfig {
    dbConfig := DBConfig{
        Host: "127.0.0.1", // 替换原来的localhost
        Port: 3306,
        User: "root",
        Password: "",
        DBName: "resourcesdb",
    }
    return &dbConfig
}

2. 完善错误处理逻辑

修改main.go中的数据库连接错误处理,连接失败直接终止程序,避免后续空指针操作:

func main() {
    Config.DB, err = gorm.Open("mysql", Config.DbURL(Config.BuildDBConfig()))
    if err != nil {
        fmt.Println("Status:", err)
        panic("数据库连接失败,程序终止: " + err.Error()) // 新增失败终止逻辑
    }
    defer Config.DB.Close()
    Config.DB.AutoMigrate(&Models.Client{})
    r := Routes.SetupRouter()
    r.Run()
}

3. 前置检查项

  • 提前在MySQL中创建对应的数据库:执行CREATE DATABASE IF NOT EXISTS resourcesdb;,GORM只会自动迁移表结构,不会自动创建数据库。
  • 确认MySQL的root用户密码确实为空,如有密码同步修改DBConfig中的Password字段。
验证

修改完成后重新运行程序,即可正常连接MySQL完成初始化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 14:18:03