go语言连接数据库的关键在于驱动导入、连接字符串格式和连接池配置三处,缺一不可:需用下划线导入驱动触发注册,连接串须严格符合格式(如mysql的tcp(...)括号、postgresql的sslmode参数),并显式设置setmaxopenconns等池参数以防线上故障。

Go 语言连接数据库不是“装完 Go 就能连”,关键在驱动导入、连接字符串格式、连接池配置三处,漏掉任一环节都会卡在 sql.Open 后无报错但 db.Ping() 失败。
go mod 初始化 + 驱动导入必须用下划线
不初始化模块或漏掉下划线导入,sql.Open("mysql", "...") 会 panic 报 sql: unknown driver "mysql"。这不是数据库没开,是驱动根本没注册。
- 先执行
go mod init myapp,生成go.mod - 按数据库选驱动并安装:
go get github.com/go-sql-driver/mysql(MySQL)、go get github.com/lib/pq(PostgreSQL)、go get github.com/mattn/go-sqlite3(SQLite) - 代码里必须写
import _ "github.com/go-sql-driver/mysql",下划线触发驱动的init()函数注册协议名
连接字符串格式错一个字符就静默失败
sql.Open 不校验连接,只建连接池;真正验证靠 db.Ping()。而 Ping() 失败十有八九是连接串写错了,尤其端口、用户名、数据库名大小写、SSL 参数。
Go语言(Golang)1.26.0版本提供 Go 官方 Windows amd64 MSI 安装包下载入口,版本号 1.26.0,可用于旧项目维护、兼容性测试和指定版本开发环境配置。
- MySQL 格式:
"user:password@tcp(127.0.0.1:3306)/dbname?parseTime=true&loc=Local"—— 注意tcp(...)括号不能少,&是 URL 中的 & 实体 - PostgreSQL 格式:
"host=localhost port=5432 user=pguser password=pgpass dbname=mydb sslmode=disable"——sslmode=disable开发可加,生产必须配证书 - SQLite 格式:
"./data.db"或":memory:",不涉及网络,但路径权限要检查
不设连接池参数等于线上埋雷
默认 SetMaxOpenConns(0) 表示无上限,数据库 max_connections 被打满后新请求全卡住;SetConnMaxLifetime(0) 导致连接永远不回收,遇到数据库重启或网络闪断就卡死。
- 上线前必设:
db.SetMaxOpenConns(20)(参考 DB 的max_connections * 0.7) -
db.SetMaxIdleConns(10)防止空闲连接长期占着资源 -
db.SetConnMaxLifetime(30 * time.Minute)强制复用老连接前断开重连 - 调用
defer db.Close()是好习惯,但不解决连接池泄漏问题;重点是别让 goroutine 忘记释放*sql.Tx
最容易被忽略的是事务上下文:一旦 db.Begin(),后续所有 SQL 必须走 tx.Query/tx.Exec,混用 db.Query 看似能跑,实则脱离事务控制,tx.Commit() 对它完全无效 —— 这类 bug 在压测时才暴露,且极难复现。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










