golang中连接达梦数据库使用域名来代替IP时会出现解析问题

中间件使用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
}

### 使用 Golang 连接配置达梦数据库 #### 1. 安装必要的依赖项 为了使 Go 应用程序能够与达梦数据库通信,需先安装相应的驱动。可以利用 `github.com/dmofficial/go-dm` 或者其他社区维护的支持 DM 数据库的第三方包来实现这一目标[^3]。 对于基于 ORM 的解决方案,如果计划继续沿用 GORM,则应确认所选版本兼容 DM 数据源并按照官方文档指导完成集成设置[^2]。 ```bash go get github.com/dmofficial/go-dm ``` #### 2. 建立连接字符串 创建一个有效的 DSN (Data Source Name),它通常由主机地址、端口号、用户名以及密码组成。具体格式如下所示: ```plaintext "host=your_host port=port_number user=username password=password dbname=database_name" ``` 请注意替换上述模板中的占位符为实际值以便于后续步骤中建立正确的链接[^1]。 #### 3. 初始化客户端实例 通过调用相应函数初始化一个新的 SQL 数据库对象,并传入之前构建好的 DSN 参数。下面给出了一段简单的代码片段用于展示如何执行此操作: ```go package main import ( "fmt" _ "github.com/dmofficial/go-dm" ) func initDb(dsn string) (*sql.DB, error) { db, err := sql.Open("dm", dsn) if err != nil { return nil, fmt.Errorf("failed to open database connection: %v", err) } // 测试连接有效性 if err = db.Ping(); err != nil { return nil, fmt.Errorf("cannot establish a successful ping to the server: %v", err) } return db, nil } ``` 这段代码展示了怎样打开到 DM 数据库的新会话,并验证其可用性。成功之后即可开始编写 CRUD 操作逻辑或其他业务功能。 #### 4. 实现基本的数据访问方法 一旦建立了稳定的连接通道,就可以着手定义一些基础的操作接口了。这里列举了一个读取特定记录的例子供参考: ```go type User struct { ID int Name string } // FetchUserByID retrieves a single record from users table based on provided id. func FetchUserByID(db *sql.DB, userID int) (*User, error) { var u User query := ` SELECT id, name FROM users WHERE id=$1;` row := db.QueryRow(query, userID) switch err := row.Scan(&u.ID, &u.Name); err { case sql.ErrNoRows: return nil, errors.New("no such entry found") case nil: return &u, nil default: return nil, fmt.Errorf("error occurred while fetching data: %v", err) } } ``` 以上示例说明了如何针对名为 `users` 的表格实施 SELECT 查询语句以获取指定编号对应的实体信息[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扬子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值