中间件使用gorm
driverName := "dm"
dataSourceName := fmt.Sprintf("dm://%s:%s@%s:%s/SYSDBA?charset=utf8&parseTime=true", config.Database.Username, config.Database.Password, config.Database.Address, config.Database.Port)
config.Database.Address 这里使用了比如"dm8"这样的字符串,而不是ip
执行程序会遇到Error 6001: Communication error dial address: localhost:5236的报错
这个是因为dm的驱动包中有问题,我这里使用的是V1.0.0版本的驱动
在n.go文件中,func (c *DmConnector) mergeConfigs(dsn string) error函数中有这样的逻辑
host, port, err := net.SplitHostPort(host)
if err != nil || net.ParseIP(host) == nil {
c.host = hostDef
} else {
c.host = host
}
这里可以看到,会对域名进行格式校验,如果不是合法IP,则将其替换成了hostDef,也就是localhost。
吐槽一下,两个host明明不是同一个东西,为啥不能使用2个名称呢
所以将其修改
if err != nil {
c.host = hostDef
} else if net.ParseIP(host) == nil {
if ip, err := net.LookupHost(host); err != nil {
c.host = hostDef
} else {
if len(ip) == 1 {
c.host = ip[0]
} else {
c.host = hostDef
}
}
} else {
c.host = host
}