用 database/sql + github.com/go-sql-driver/mysql 驱动即可连接 MySQL,无需自实现协议;需显式导入驱动、正确配置 DSN(含 parseTime=true 和 loc=Local)、调用 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/mysql"DNS 字符串格式固定:user:password@tcp(127.0.0.1:3306)/dbname?parseTime=true&loc=Local,注意 & 是 URL 中的 & 符号,不是 & 实体parseTime=true 才能让 time.Time 正确解析 DATETIME 字段;loc=Local 避免时区错乱(否则可能默认 UTC)sql.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_timeout=28800 秒,但云数据库常更短)不要在每次请求都 sql.Open,复用全局 *sql.DB 实例查询结果要手动 rows.Close(),否则连接泄漏用 db.Query 得到 *sql.Rows 后,即使循环读完所有数据,也必须显式调用 rows.Close()。否则底层连接不会归还给连接池,MaxOpenConns 很快耗尽,后续请求卡住或报 dial tcp: i/o timeout。 Mokker AI AI产品图添加背景
相关推荐
l1t11 分钟前
测试DuckDB v2.1.0-alpha49002的bignum乘法麦壳饼42 分钟前
SonnetDB:向量召回率评估中的精确基线与参数记录ClouGence1 小时前
数据如何随时可用?广西水牛先生的 MySQL 实时同步实践斯晨的AI笔记1 小时前
rsync 部署避坑:脚本执行位被 git 模式位抹掉,巡检备份双静默失败的排查与根治严谨的麻辣烫1 小时前
静态代理 IP 的出口一致性如何验证?Python 请求检测与异常排查这个DBA有点耶1 小时前
innodb_autoinc_lock_mode的三种模式:批量插入时自增锁的持有逻辑与调优我命由我123451 小时前
5-1.Python 编码进阶 - 函数进阶(参数、返回值、递归、函数作为参数传递、lambda 匿名函数)FITA阿泽要努力2 小时前
Fork Agent:共享上下文的艺术小蒜学长2 小时前
基于Spring Boot+Vue3的在线游戏技术指导师匹配系统的设计与实现(代码+数据库+LW)DeeGLMath2 小时前
optimtool最新版研究梯度优化