新闻详情

新闻详情

首页 / 资讯中心 / 详情

Go Gin + SQL 全栈:CRUD、事务、迁移、监控全攻略

发布时间:2026/9/25 18:45:35来源:尧图网络
Go Gin + SQL 全栈:CRUD、事务、迁移、监控全攻略
Go Gin SQL 全栈CRUD、事务、迁移、监控全攻略Gin SQL 是后端项目最常见的搭配。本文带你看一眼真实项目的完整闭环。一、项目布局cmd/server internal/{handler, service, repo} internal/config pkg/types configs/config.yaml二、main.gofuncmain(){cfg,_:config.Load()db,_:sql.Open(mysql,cfg.DB.DSN)db.SetMaxOpenConns(50)db.SetMaxIdleConns(10)deferdb.Close()userRepo:repo.NewUserRepo(db)userSvc:service.NewUserService(userRepo)handler:handler.NewUserHandler(userSvc)r:gin.Default()handler.Register(r)log.Println(server listens on :8080)http.ListenAndServe(:8080,r)}三、配置加载typeConfigstruct{DBstruct{DSNstringMaxint}PortstringAppEnvstring}funcLoad()(*Config,error){viper.SetConfigName(config)viper.AddConfigPath(./configs)err:viper.ReadInConfig()varc Configreturnc,err}四、Repo 层typeUserRepointerface{Find(idint)(User,error);Create(u User)(int64,error)}typeuserRepostruct{db*sql.DB}funcNewUserRepo(db*sql.DB)UserRepo{returnuserRepo{db:db}}func(r*userRepo)Find(idint)(User,error){varu User err:r.db.QueryRow(SELECT id, name FROM users WHERE id?,id).Scan(u.ID,u.Name)returnu,err}func(r*userRepo)Create(u User)(int64,error){res,err:r.db.Exec(INSERT INTO users(name) VALUES(?),u.Name)iferr!nil{return0,err}returnres.LastInsertId()}五、Service 层typeuserServicestruct{repo UserRepo}func(s*userService)CreateUser(ctx context.Context,namestring)(int64,error){ifname{return0,ErrEmptyName}returns.repo.Create(User{Name:name})}六、Handler 层func(h*UserHandler)Register(r*gin.Engine){r.GET(/users/:id,h.Get)r.POST(/users,h.Post)}func(h*UserHandler)Get(c*gin.Context){id,_:strconv.Atoi(c.Param(id))u,err:h.svc.Find(c.Request.Context(),id)iferr!nil{c.JSON(http.StatusNotFound,gin.H{err:not found});return}c.JSON(http.StatusOK,u)}func(h*UserHandler)Post(c*gin.Context){varreqstruct{Namestringjson:name}iferr:c.ShouldBindJSON(req);err!nil{c.JSON(400,gin.H{err:err.Error()});return}id,err:h.svc.CreateUser(c.Request.Context(),req.Name)iferr!nil{c.JSON(500,gin.H{err:err.Error()});return}c.JSON(200,gin.H{id:id})}七、事务与一致性func(s*userService)TransferMoney(ctx context.Context,from,toint,amountint64)error{tx,err:s.db.BeginTx(ctx,nil)iferr!nil{returnerr}defertx.Rollback()if_,err:tx.Exec(UPDATE balances SET amountamount-? WHERE user?,amount,from);err!nil{returnerr}if_,err:tx.Exec(UPDATE balances SET amountamount? WHERE user?,amount,to);err!nil{returnerr}returntx.Commit()}八、迁移 版本管理migrate create-extsql-dirmigrations-seqadd_users migrate-pathmigrations-databasemysql://user:pwdhost:3306/appup九、监控importgithub.com/prometheus/client_golang/prometheus/promhttphttp.Handle(/metrics,promhttp.Handler())业务层用中间件记录 QPS、error_rater.Use(func(c*gin.Context){deferfunc(){requestCount.WithLabelValues(c.Request.Method,c.FullPath(),strconv.Itoa(c.Writer.Status())).Inc()}()c.Next()})十、链路追踪importgo.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelginr.Use(otelgin.Middleware(user-svc))业务也加上ctx,span:tracer.Start(ctx,service.CreateUser)deferspan.End()十一、中间件限流importgolang.org/x/time/ratelimiter:rate.NewLimiter(10,20)r.Use(func(c*gin.Context){if!limiter.Allow(){c.AbortWithStatusJSON(429,gin.H{err:rate limited})return}c.Next()})十二、CI/CDtest:script:-go test ./...-racebuild:script:-go build-o app .deploy:script:-kubectl apply-f deployment.yaml十三、踩坑清单忘记读取 ctx所有 repo / service 方法必带 ctx业务事务跨多个流程 → 改 sagajson.bigint 精度丢失十四、未来Serverless 部署一体化可观测平台十五、总结与展望三层架构 Gin SQL 是 Go 后端的金标准。掌握它能为以后快速搭建业务铺路。十六、参考文献Gin 文档Go database/sql 标准库sqlmigrate
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Windows 10 22H2多国语言部署实操指南:从镜像定制到三层语言生效 2026/9/25 19:24:51

Windows 10 22H2多国语言部署实操指南:从镜像定制到三层语言生效

1. 这不是“下载地址”清单,而是一份Windows 10 22H2多语言镜像的实操生存指南你搜到“windows10 22H2多国语言下载地址”,心里想的大概率不是单纯复制一个链接——而是:我手头这台老ThinkPad X220要重装系统,但原厂预装的是简体中…

阅读更多 →
小白程序员必看:2026年AI大模型人才风口与高薪指南 2026/9/25 19:24:51

小白程序员必看:2026年AI大模型人才风口与高薪指南

AI岗位同比暴涨12倍,人才缺口超500万,市场供需两极分化严重。大模型算法岗稀缺,数据标注等基础岗位过剩。AI人才需具备技术场景复合能力,高学历与实战经验是关键。薪酬分层明显,顶尖人才年薪百万以上。校招分化明显&am…

阅读更多 →
国际版外卖系统:多语言配置和支付通道怎么分开测 2026/9/25 19:24:45

国际版外卖系统:多语言配置和支付通道怎么分开测

国际版外卖系统交付中,若把 i18n 发布与支付通道配置绑在同一次上线窗口,任一环节回滚都会拖死另一项。更稳的是多语言配置与支付通道分开测:语言走配置中心版本号;支付走沙箱 intent 回调幂等。结论:locale 与 payme…

阅读更多 →
OFDM参数设计全解析:子载波间隔、循环前缀与FFT点数的权衡 2026/9/25 19:24:45

OFDM参数设计全解析:子载波间隔、循环前缀与FFT点数的权衡

1. 先搞清楚:OFDM参数设计到底在“设计”什么做通信系统的人都知道一句话:OFDM的参数定下来,系统的半条命就定下来了。这话真不夸张,因为子载波间隔、循环前缀长度、符号时长、FFT点数这些参数不是孤立存在的,它们互相…

阅读更多 →
基于SSM的药品电子商城系统:从架构设计到在线诊断闭环实践 2026/9/25 19:24:45

基于SSM的药品电子商城系统:从架构设计到在线诊断闭环实践

做过电商系统的朋友都知道,药品商城跟普通卖衣服、卖数码产品的商城根本不是一回事。它的背后牵涉到药品信息合规展示、库存批次跟踪、处方药销售管控、甚至还有远程问诊开方的需求。而SSM,也就是Spring SpringMVC MyBatis这套经典组合,在这…

阅读更多 →
消息通知怎么设计?站内信、邮件和短信不要乱发 2026/9/25 19:24:45

消息通知怎么设计?站内信、邮件和短信不要乱发

企业系统里的消息通知,很容易从“提醒用户及时处理”变成“到处弹、到处发、没人看”。站内信、邮件、短信、企业微信、钉钉、App 推送都能发,但真正难的是:什么事件值得通知,通知谁,用哪个渠道,失败要不要…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉