Golang初级项目如何接入数据库
发布时间 - 2026-01-07 00:00:00 点击率:次用 database/sql 就够了,它轻量稳定可控,适合初学者和小项目;应避免过早使用 ORM,需手动管理连接、事务和预处理逻辑,并合理配置连接池参数。
用 database/sql 就够了,别急着上 ORM
Go 初级项目接入数据库,第一原则是「先跑通、再优化」。database/sql 是标准库,轻量、稳定、可控,比任何第三方 ORM 都更适合练手和小项目。ORM(比如 gorm 或 sqlx)看似省事,但隐藏了连接管理、事务边界、预处理逻辑等关键细节,出问题时反而更难定位。
实操建议:
- 只导入驱动(如
_ "github.com/lib/pq"或_ "github.com/go-sql-driver/mysql"),不引入额外抽象层 - 用
sql.Open获取*sql.DB,立刻调用db.Ping()验证连接是否可用 - 连接字符串里避免硬编码密码,改用环境变量(
os.Getenv("DB_URL")) - 不要在 handler 里反复
sql.Open——*sql.DB本身是并发安全的、带连接池,全局复用一个实例即可
sql.QueryRow 和 sql.Exec 要配对用好
初学者常混淆查询和执行:读数据用 QueryRow / Query,写数据(INSERT/UPDATE/DELETE)用 Exec。混用会导致 panic 或静默失败(比如对 INSERT 用 QueryRow.Scan,会报 sql: expected 1 destination arguments)。
常见错误场景:
- INSERT 后想获取自增 ID,却用了
QueryRow("INSERT ...").Scan(&id)→ 应该用Exec+Result.LastInsertId()(MySQL)或QueryRow("INSERT ... RETURNING id").Scan(&id)(PostgreSQL) - UPDATE 语句没检查
RowsAffected(),误以为更新成功 → 实际可能 where 条件没匹配到任何行 - 用
Query做单行查询却不调用rows.Next()和rows.Scan()→ 连接不会释放,迟早触发too many connections
row := db.QueryRow("SELECT name FROM users WHERE id = $1", 123)
var name string
if err := row.Scan(&name); err != nil {
// 处理 NOT FOUND 或其他 error
return
}事务必须显式控制,别依赖框架自动提交
Go 没有「声明式事务」机制,Begin → Commit/Rollback 全靠手动。初级项目最容易漏的是 defer tx.Rollback() 的覆盖逻辑 —— 如果 Commit 成功了,还执行 Rollback 会报错(虽然不影响数据,但日志刷屏)。
正确模式:
- 用
tx, err := db.Begin()开启事务 - 所有 SQL 都调用
tx.QueryRow/tx.Exec,不是db本身 -
if err != nil { tx.Rollback(); return err }出现在每个关键步骤后 - 最后
tx.Commit()成功才返回 nil;否则确保Rollback只执行一次
tx, err := db.Begin()
if err != nil {
return err
}
defer func() {
if p := recover(); p != nil {
tx.Rollback()
panic(p)
}
}()
_, err = tx.Exec("INSERT INTO orders (...) VALUES (...)")
if err != nil {
tx.Rollback()
return err
}
return tx.Commit()连接池参数不调默认值,大概率出生产事故
*sql.DB 默认最大连接数是 0(无限制),在并发稍高的服务里,数据库很快被拖垮。初级项目也得设基础水位:
-
db.SetMaxOpenConns(20):防止打爆数据库连接数 -
db.SetMaxIdleConns(5):空闲连接太多浪费资源,太少又频繁建连 -
db.SetConnMaxLifetime(30 * time.Minute):避免连接僵死(尤其云数据库有连接超时策略)
这些参数必须在 db.Ping() 之后、业务使用之前设置,否则无效。另外,别在每次 HTTP 请求里新建 *sql.DB —— 它不是轻量对象,初始化开销大,且连接池无法复用。
# mysql
# git
# go
# github
# golang
# 编码
# 环境变量
# 标准库
# sql
# if
# 字符串
# nil
# delete
# 并发
# 对象
# database
# postgresql
# 数据库
# http
# 连接池
# 会报
# 复用
# 连接数
# 的是
# 太多
# 则是
# 就够了
# 用了
# 或其他
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
,网页ppt怎么弄成自己的ppt?
长沙做网站要多少钱,长沙国安网络怎么样?
想要更高端的建设网站,这些原则一定要坚持!
Claude怎样写约束型提示词_Claude约束提示词写法【教程】
如何为不同团队 ID 动态生成多个非值班状态按钮
如何在建站宝盒中设置产品搜索功能?
Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
如何破解联通资金短缺导致的基站建设难题?
如何用已有域名快速搭建网站?
米侠浏览器网页图片不显示怎么办 米侠图片加载修复
jQuery 常见小例汇总
消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工
网站制作企业,网站的banner和导航栏是指什么?
微信小程序 配置文件详细介绍
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
三星、SK海力士获美批准:可向中国出口芯片制造设备
如何用PHP快速搭建CMS系统?
Laravel如何实现数据库事务?(DB Facade示例)
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤
HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】
ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法
如何基于PHP生成高效IDC网络公司建站源码?
Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践
网站制作软件有哪些,制图软件有哪些?
JS中对数组元素进行增删改移的方法总结
Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】
Laravel如何实现文件上传和存储?(本地与S3配置)
再谈Python中的字符串与字符编码(推荐)
高防服务器:AI智能防御DDoS攻击与数据安全保障
Linux系统命令中screen命令详解
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】
高防服务器如何保障网站安全无虞?
Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
Laravel如何优化应用性能?(缓存和优化命令)
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程
JavaScript如何实现错误处理_try...catch如何捕获异常?
Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】
如何在IIS服务器上快速部署高效网站?
Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议
Angular 表单中正确绑定输入值以确保提交与验证正常工作
Win11怎么开启自动HDR画质_Windows11显示设置HDR选项
IOS倒计时设置UIButton标题title的抖动问题
如何在阿里云购买域名并搭建网站?
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
如何快速选择适合个人网站的云服务器配置?
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
下一篇:windows电脑屏幕出现黑边
下一篇:windows电脑屏幕出现黑边

