我在 Docker 容器内安装了一个 DB2 实例。现在我尝试使用 Windows 11 x64 从一个简单的 Golang 应用程序连接到它,但出现此错误:
连接数据库时出错:无法 ping 数据库:SQLDriverConnect:{IM002} [Microsoft][Driver Manager ODBC] 未找到数据源名称且未指定默认驱动程序。
我尝试从 IBM 下载 DB2 驱动程序(https://www.ibm.com/support/pages/db2-odbc-cli-driver-download-and-installation-information),将其解压并安装在 C:/Program Files 中,将其添加到我的 PATH 环境变量中,然后重新启动我的电脑。之后,我仍然没有在“ODBC 数据源管理器”驱动程序列表中看到该驱动程序。
这是我的连接代码:
import (
"database/sql"
"fmt"
_ "github.com/alexbrainman/odbc"
)
func ConnectDB() (*sql.DB, error) {
connStr := "DATABASE=TEST1;HOSTNAME=localhost;PORT=50000;PROTOCOL=TCPIP;UID=db2inst1;PWD=db2inst1;"
db, err := sql.Open("odbc", connStr)
if err != nil {
return nil, fmt.Errorf("failed to open database: %v", err)
}
if err = db.Ping(); err != nil {
return nil, fmt.Errorf("failed to ping database: %v", err)
}
fmt.Println("Connected to DB2 database!")
return db, nil
}
这是我的 main.go:
import (
"database/sql"
"go-db-check/db"
"log"
)
func main() {
database, err := db.ConnectDB()
if err != nil {
log.Fatalf("Error connecting to database: %v", err)
}
defer func(database *sql.DB) {
closeErr := database.Close()
if closeErr != nil {
log.Println("Error during connection shutdown: ", err)
}
}(database)
}
我假设您想在 ms-windows 上运行 go,并从 golang 连接到恰好位于 docker 容器中的 Db2 数据库。
使用 IBM 的 go 接口,可从https://github.com/ibmdb/go_ibm_db获取
完全理解自述文件中的所有细节并让 IBM 的示例程序运行是值得的,也是必要的。
此接口将自动下载名为“clidriver”的 odbc 驱动程序(默认情况下会这样做)。这是一个占用空间很小的零安装 odbc 驱动程序,适用于 Db2,您几乎无需外部配置即可操作,或者您也可以通过名为 的 xml 文件进行配置
db2dsdriver.cfg
。它没有 GUI,而是提供命令行工具来配置它、对其进行故障排除以及各种其他功能(如测试连接性、获取版本信息等)。clidriver 工具都记录在 Db2 知识中心在线的主要页面上,可通过https://www.ibm.com/docs/en/db2/11.5?topic=dsd-installing-data-server-driver-odbc-cli-software-windows-operating-systems间接访问在使用 go 编程时,您可以选择在 go 脚本中包含完整的连接字符串,或者仅包含 DSN(所有其他连接详细信息都存储在 db2dsdriver.cfg 外部,您可以使用文本编辑器进行配置,也可以通过此处描述的特殊命令行进行配置https://www.ibm.com/docs/en/db2/11.5?topic=commands-db2cli-db2-interactive-cli)
启动时,通常将整个连接字符串放入 go 脚本中更容易(因为这意味着不需要外部配置),但这可能不适合企业使用。
如果您需要 MS-windows odbcad32 工具来显示 DSN,则合适的配置(
db2cli -setup
... 和db2cli registerdsn
...)可能会有所帮助。但这是可选的。另外,您必须确保您的 docker 配置公开了 Db2 实例正在监听的端口号,并且该(映射的)端口号在您的 MS-windows 软件防火墙上为入站/出站 TCP 流量打开,并且您在连接字符串或外部配置文件中引用了正确的端口号。