tdsql boundless 使用标准 mysql 驱动(gorm.io/driver/mysql),dsn 必须含 loc=local 和 parsetime=true,端口为6001,需显式调用 mysql.open(dsn),并配置连接池、超时及 nowfunc。

连接 TDSQL Boundless 需用标准 MySQL 驱动,不是专用驱动
直接用 gorm.io/driver/mysql 就行,TDSQL Boundless 兼容 MySQL 协议,官方不提供独立 Go 驱动。强行找“tdsql-go-driver”或改包名是常见误区,反而导致连接失败或功能缺失。
关键点在于:TDSQL Boundless 是 MySQL 兼容层,GORM 只需走标准 MySQL 流程,重点调参适配分布式特性。
DSN 字符串必须加 loc=Local 和 parseTime=True
缺这两个参数,time.Time 字段会解析失败或时区错乱,尤其在跨 AZ 部署的 TDSQL 集群中更明显。
-
loc=Local:让 Go 使用本地时区解析 timestamp/datetime,避免因 TDSQL 节点所在服务器时区不一致引发时间偏移 -
parseTime=True:启用 time 类型自动解析,否则sql.NullTime会读成字符串或零值 - 不要用
loc=Asia/Shanghai—— TDSQL 不保证所有节点都设了该时区,Local 更稳定
初始化 GORM 时要显式传 mysql.Open(dsn)
GORM v2 不再接受字符串驱动名,必须用驱动包的 Open 函数构造 Dialector。写错会 panic 报 “unsupported driver: mysql”。
正确写法:
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
<p>dsn := "user:pass@tcp(tdsql-cluster-xxx.tencentcdb.com:6001)/mydb?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
</p>
注意:tcp(...:6001) 是 TDSQL Boundless 默认端口(非 3306),集群地址从腾讯云控制台「数据库连接」页复制,带端口号。
连接池和超时参数必须手动调大
TDSQL 是分布式架构,网络跳数多、响应延迟波动大。默认连接池(maxIdle=2, maxOpen=0)和无超时设置会导致大量 i/o timeout 或连接枯竭。
- 用
db.DB().SetMaxOpenConns(50)和SetMaxIdleConns(20)防止连接争抢 - 加
ConnectTimeout:避免建连卡住整个服务启动 - 加
QueryTimeout和ExecTimeout:防止慢查询拖垮接口
示例:
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
ConnectTimeout: 5 * time.Second,
NowFunc: func() time.Time { return time.Now().In(time.Local) },
})
sqlDB, _ := db.DB()
sqlDB.SetMaxOpenConns(50)
sqlDB.SetMaxIdleConns(20)
sqlDB.SetConnMaxLifetime(30 * time.Minute)
真正容易被忽略的是 NowFunc:TDSQL 的 DEFAULT CURRENT_TIMESTAMP 行为依赖客户端传入的本地时间,不设这个,CreatedAt 字段可能全为零值。











