用 database/sql github.com/go-sql-driver/mysql 驱动即可连接 MySQL无需自实现协议需显式导入驱动、正确配置 DSN含 parseTimetrue 和 locLocal、调用 db.Ping() 校验连通性、合理设置连接池、手动关闭 rows、事务中统一使用 tx 对象并显式提交或回滚。用 database/sql mysql 驱动就能连别自己写底层协议Go 官方不内置 MySQL 协议实现必须搭配第三方驱动。最常用的是 github.com/go-sql-driver/mysql它实现了 database/sql/driver 接口和标准库无缝协作。别去找“纯 Go 实现的 MySQL 客户端”或试图封装 TCP 连接——既没必要又容易出错。常见错误现象sql: unknown driver mysql (forgotten import?)本质是只写了 import database/sql却没导入驱动包驱动注册靠 _ github.com/go-sql-driver/mysql 的 init 函数。必须显式导入驱动 import _ github.com/go-sql-driver/mysqlDNS 字符串格式固定user:passwordtcp(127.0.0.1:3306)/dbname?parseTimetruelocLocal注意 是 URL 中的 符号不是 实体parseTimetrue 才能让 time.Time 正确解析 DATETIME 字段locLocal 避免时区错乱否则可能默认 UTCsql.Open 不是真的连数据库只是初始化连接池sql.Open 返回 *sql.DB 时根本不发任何网络请求。它只校验 DSN 格式、注册驱动是否可用然后配置连接池参数。真正建连发生在第一次执行 Query、Exec 或 Ping 时。容易踩的坑db, err : sql.Open(mysql, dsn); if err ! nil { panic(err) } —— 这里 err 几乎不会非 nil但后续 db.Ping() 才暴露真实连通性问题。立即学习“go语言免费学习笔记深入”上线前务必加 if err : db.Ping(); err ! nil { log.Fatal(err) }设置连接池 db.SetMaxOpenConns(25)、db.SetMaxIdleConns(25)、db.SetConnMaxLifetime(5 * time.Minute)避免连接长期空闲被 MySQL server kill默认 wait_timeout28800 秒但云数据库常更短不要在每次请求都 sql.Open复用全局 *sql.DB 实例查询结果要手动 rows.Close()否则连接泄漏用 db.Query 得到 *sql.Rows 后即使循环读完所有数据也必须显式调用 rows.Close()。否则底层连接不会归还给连接池MaxOpenConns 很快耗尽后续请求卡住或报 dial tcp: i/o timeout。 Mokker AI AI产品图添加背景