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

3 回复

你是否尝试过硬编码你的连接字符串?这样能正常工作吗?你的连接字符串是否真的按照你预期的方式组装,还是存在某些问题?将配置默认为空字符串是否有意义,或者对缺失的配置值报错会更合适?

更多关于Golang应用无法连接MySQL数据库的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


问题最终归结为几个方面:

  1. 当我把 Go 服务中硬编码的参数复制到配置文件中时,字段周围保留了引号。这些引号被原样读取,导致了一个问题。删除引号后,我解决了这个问题。

  2. 不过,我仍然无法连接,当时我使用的是 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")
}

主要修改点:

  1. 使用 @tcp(host:port) 格式而不是 @(host:port)
  2. 添加了 parseTime=true 参数来处理时间类型
  3. 添加了 loc=Local 参数设置时区
  4. 使用 fmt.Sprintf 构建连接字符串,代码更清晰

如果问题仍然存在,可以添加超时参数:

DBConnect := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=true&loc=Local&timeout=30s",
    DBUser, DBPass, DBHost, DBPort, DBName)

检查你的配置文件中端口号是否正确,确保没有多余的引号或特殊字符。

回到顶部