Golang API无法连接MySQL数据库 报错连接被拒绝且数据库已关闭
问题根源
两个报错为因果关系:
- 首个报错
dial tcp [::1]:3306: connect: connection refused是因为系统将localhost解析为IPv6的环回地址::1,但你的MySQL服务没有监听IPv6的3306端口。你本地执行mysql -uroot能正常连接,是因为默认走Unix套接字通信,没有走TCP协议,所以不受监听地址影响。 - 后续
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
相关产品推荐
相关产品推荐

