如何在Golang环境中搭建数据库连接_数据库开发环境配置
技术百科
P粉602998670
发布时间:2026-01-20
浏览: 次 使用database/sql连接PostgreSQL/MySQL前必须安装对应驱动并下划线导入,sql.Open仅初始化连接池不校验连接,需调用db.Ping()验证;连接池参数默认无限制,须显式设置SetMaxOpenConns等避免线上问题;事务中所有操作必须通过*sql.Tx执行。
用 database/sql 连 PostgreSQL / MySQL 前必须装驱动
Go 标准库的 database/sql 是接口层,不带具体数据库实现。直接 import "database/sql" 后调用 sql.Open 会 panic:「sql: unknown driver "postgres"」或「unknown driver "mysql"」。
- PostgreSQL:必须
go get github.com/lib/pq(注意不是github.com/libpq),然后在代码里import _ "github.com/lib/pq"(下划线导入触发 init) - MySQL:推荐
go get github.com/go-sql-driver/mysql,导入写法同上:import _ "github.com/go-sql-driver/mysql" - SQLite3:用
go get github.com/mattn/go-sqlite3,注意它依赖 C 编译器,Windows 用户需提前装好 MinGW 或 TDM-GCC
sql.Open 不真正连数据库,db.Ping() 才校验连接有效性
sql.Open 只是初始化连接池配置,返回 *sql.DB 对象。即使传了错误的 host 或 port,也不会报错。常见误判是以为 sql.Open 失败就代表连不上。
- 正确做法:
调用
db.Ping()(同步阻塞)或db.PingContext(ctx)(支持超时) - 连接字符串格式要严格:PostgreSQL 是
"host=localhost port=5432 user=xxx password=xxx dbname=xxx sslmode=disable";MySQL 是"user:password@tcp(127.0.0.1:3306)/dbname" - 如果
Ping()报错,检查是否漏了驱动导入、端口被占、防火墙拦截,或数据库服务根本没启动
连接池参数不设默认值容易拖垮服务
Go 的 *sql.DB 自带连接池,但 SetMaxOpenConns、SetMaxIdleConns、SetConnMaxLifetime 全部默认为 0(即无限制或无限期),线上环境极易引发数据库连接数爆满、连接复用失效、TIME_WAIT 堆积等问题。
-
db.SetMaxOpenConns(20):控制最大并发连接数,建议设为数据库侧max_connections的 70% 左右 -
db.SetMaxIdleConns(10):空闲连接上限,避免长期闲置连接占用资源 -
db.SetConnMaxLifetime(30 * time.Minute):强制连接在池中存活不超过 30 分钟,防止因数据库重启或网络中断导致 stale connection
事务里别混用 db.Query 和 tx.Query
开启事务后,所有 SQL 操作必须通过 *sql.Tx 对象执行,不能继续用原始 *sql.DB。否则语句不会受事务控制,tx.Commit() 或 tx.Rollback() 对它们完全无效。
- 错误写法:
tx, _ := db.Begin() _, _ := db.Query("INSERT ...") // 这条不在事务里! tx.Commit() - 正确写法:
tx, _ := db.Begin() _, _ := tx.Query("INSERT ...") // 必须用 tx.Query / tx.Exec / tx.Prepare if err != nil { tx.Rollback() return } tx.Commit() - 注意:事务对象不可复用,
tx.Commit()后再调用tx.Query会 panic:「sql: transaction has already been committed or rolled back」
实际项目中,最容易被忽略的是连接池参数和事务作用域边界——它们不会立刻报错,但会在高并发或长时间运行后突然暴露问题。
# ai
# 的是
# 也不
# 线上
# 长时间
# windows
# 下划线
# 复用
# 设为
# win
# word
# 防火墙
# 端口
# go
# golang
# 并发
# 对象
# 堆
# 字符串
# 接口
# 数据库
# 报错
# git
# github
# 作用域
# ssl
# mysql
# sql
# postgresql
# database
# 连接池
# 连接数
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 如何在Golang中优化文件读写性能_使用缓冲和并
- MAC怎么使用表情符号面板_MAC Emoji快捷
- 如何在Golang中理解指针比较_Golang地址
- Avalonia如何实现跨窗口通信 Avaloni
- Win10电脑怎么设置IP地址_Windows10
- Python 中将 ISO 8601 时间戳转换为
- Win11怎么开启剪贴板历史记录_Windows1
- Windows10系统怎么查看设备管理器_Win1
- Win11怎么设置任务栏对齐方式_Windows1
- php打包exe怎么传递参数_命令行参数接收方法【
- Windows10蓝屏代码DPC_WATCHDOG
- c++中如何使用auto关键字_c++11类型推导
- 如何使用Golang匿名函数_快速定义临时函数逻辑
- MAC如何安装Git版本控制工具_MAC开发环境配
- Win11怎么关闭搜索历史_Win11清除任务栏搜
- Python多线程使用规范_线程安全解析【教程】
- Bpmn 2.0的XML文件怎么画流程图
- 如何高效获取循环末次生成的 NumPy 数组最后一
- 如何在Mac上搭建Golang开发环境_使用Hom
- Windows如何使用注册表查找和删除项?(reg
- Win11怎么关闭透明效果_Windows11辅助
- Win11怎么设置默认输入法 Win11固定中文输
- Win11怎么设置开机问候语_自定义Win11锁屏
- 如何使用Golang sort排序切片_Golan
- Win10如何更改开机密码_Windows10登录
- Win10如何关闭安全中心所有通知 Win10禁用
- c++如何利用doxygen生成开发文档_c++
- 如何提升Golang JSON序列化性能_Gola
- Windows10系统怎么查看CPU核心数_Win
- php错误怎么开启_display_errors与
- Windows10如何更改桌面背景_Win10个性
- Win11怎么激活Windows10_Win11激
- Win11怎么设置鼠标宏_Win11鼠标按键自定义
- Win11怎么调整屏幕亮度_Windows 11调
- c# F# 的 MailboxProcessor
- windows系统如何安装cab更新补丁_wind
- Win10怎样清理C盘Steam游戏缓存_Win1
- Win11无法安装软件怎么办_Win11解除应用安
- 如何在Golang中修改数组元素_通过指针实现原地
- 手机php文件怎么变成mp4_安卓苹果打开php转
- Windows 11怎么设置默认解压软件_Wind
- mac怎么安装字体_MAC添加第三方字体与字体册管
- Win11怎么更改系统语言为中文_Windows1
- PHP怎么接收URL中的锚点参数_获取#后面参数值
- mac怎么分屏_MAC双屏显示与分屏操作技巧【指南
- Windows蓝屏BAD_POOL_HEADER故
- Win11怎么查看局域网电脑_Windows 11
- Win11怎么设置多显示器任务栏 Win11扩展任
- Win11怎么把图标拖到任务栏_Win11固定应用
- windows 10专注助手怎么关闭_window


QQ客服