Golang应用无法连接MySQL数据库的问题
Golang应用无法连接MySQL数据库的问题 我正在使用 github.com/go-sql-driver/mysql 包来连接 MySQL。我的变量值来自配置文件,每个元素都是字符串类型。
DBUser = readconf.GetConfig("Defaults", "DBUser", "")
DBPass = readconf.GetConfig("Defaults", "DBPass", "")
DBHost = readconf.GetConfig("Defaults", "DBHost", "")
DBPort = readconf.GetConfig("Defaults", "DBPort", "")
DBName = readconf.GetConfig("Defaults", "DBName", "")
SetMaxOpenConns, _ = strconv.Atoi(readconf.GetConfig("Defaults", "SetMaxOpenConns", ""))
DBConnect = DBUser + ":" + DBPass + "@" + "(" + DBHost + ":" + DBPort + ")/" + DBName + "?charset=utf8&autocommit=true"
if db, err = connectDB( DBConnect ); err != nil {
fmt.Println( err )
panic( "Can't connect to the database" )
}
当我尝试运行程序时,出现以下错误:
dial tcp: lookup tcp/“3306”: Servname not supported for ai_socktype
panic: Can’t connect to the database
我在这里做错了什么?
谢谢
更多关于Golang应用无法连接MySQL数据库的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html
你是否尝试过硬编码你的连接字符串?这样能正常工作吗?你的连接字符串是否真的按照你预期的方式组装,还是存在某些问题?将配置默认为空字符串是否有意义,或者对缺失的配置值报错会更合适?
更多关于Golang应用无法连接MySQL数据库的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
问题最终归结为几个方面:
-
当我把 Go 服务中硬编码的参数复制到配置文件中时,字段周围保留了引号。这些引号被原样读取,导致了一个问题。删除引号后,我解决了这个问题。
-
不过,我仍然无法连接,当时我使用的是 root 账户来测试程序。我创建了一个新的用户账户,该账户具有从本地主机访问的权限,现在一切正常了。
所以,最终问题出在 MySQL 配置略有不当以及配置文件中引入了引号。
谢谢。
这个错误通常是由于数据库连接字符串格式不正确导致的。问题出现在端口号部分,错误信息显示系统无法解析 tcp/“3306” 格式。
以下是正确的连接字符串格式:
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/go-sql-driver/mysql"
)
func connectDB(dataSourceName string) (*sql.DB, error) {
db, err := sql.Open("mysql", dataSourceName)
if err != nil {
return nil, err
}
// 设置连接池参数
if SetMaxOpenConns > 0 {
db.SetMaxOpenConns(SetMaxOpenConns)
}
// 验证连接
if err := db.Ping(); err != nil {
return nil, err
}
return db, nil
}
func main() {
// 从配置文件读取参数
DBUser := readconf.GetConfig("Defaults", "DBUser", "")
DBPass := readconf.GetConfig("Defaults", "DBPass", "")
DBHost := readconf.GetConfig("Defaults", "DBHost", "")
DBPort := readconf.GetConfig("Defaults", "DBPort", "")
DBName := readconf.GetConfig("Defaults", "DBName", "")
SetMaxOpenConns, _ := strconv.Atoi(readconf.GetConfig("Defaults", "SetMaxOpenConns", ""))
// 正确的连接字符串格式
DBConnect := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=true&loc=Local",
DBUser, DBPass, DBHost, DBPort, DBName)
db, err := connectDB(DBConnect)
if err != nil {
log.Fatalf("Can't connect to the database: %v", err)
}
defer db.Close()
fmt.Println("Successfully connected to the database")
}
主要修改点:
- 使用
@tcp(host:port)格式而不是@(host:port) - 添加了
parseTime=true参数来处理时间类型 - 添加了
loc=Local参数设置时区 - 使用
fmt.Sprintf构建连接字符串,代码更清晰
如果问题仍然存在,可以添加超时参数:
DBConnect := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=true&loc=Local&timeout=30s",
DBUser, DBPass, DBHost, DBPort, DBName)
检查你的配置文件中端口号是否正确,确保没有多余的引号或特殊字符。

