Golang/gin:如何将 db 传递给路由器功能

Posted

技术标签:

【中文标题】Golang/gin:如何将 db 传递给路由器功能【英文标题】:Golang/gin: How to Pass db to router functions 【发布时间】:2017-06-04 09:33:37 【问题描述】:

我正在使用 gin 框架。我正在像这样在主函数中打开 sqlite 数据库

func main() 
...
db, err := sql.Open("sqlite3", "./libreread.db")
CheckError(err)
defer db.Close()
...

我在主函数中有这些路由器处理程序。

...
r.GET("/", GetHomePage)
r.GET("/signin", GetSignIn)
r.POST("/signin", PostSignIn)
...

如何通过路由器处理程序 func PostSignin(c *gin.Context) 传递该 db 值?

这样我就可以避免每次在函数中打开和关闭数据库。

更新:我正在使用 go-sqlite3 包。

谢谢!

【问题讨论】:

你试过我的解决方案了吗? 【参考方案1】:

假设你在db中初始化了你的sql客户端,那么你可以将它传递给不同的路由

r.GET("/", GetHomePageHandler(&db))

在你的 GetHomePageHandler 中:

func GetHomePageHandler(sqldb *SQLiteConn) func (*gin.Context) 
    return  func (*gin.Context) 
      . . .
    

*SQLiteConn 是您的 sql 数据库实例的类型。我不知道您当前使用的是哪个包,所以这只是一个示例。

您还可以找到更优雅的解决方法in this answer,

【讨论】:

我已经更新了问题。我正在使用 go-sqlite3。当我通过 &db 时,它告诉(未定义:GetHomePage,未定义:*SQLITE.DB)。我不确定我应该提到哪个实例。您能否根据此更新您的答案?谢谢! 我没用过。导入"reflect" 后用fmt.Println(reflect.TypeOf(db)) 检查db 的类型,然后将*SQLite.DB 更改为正确的返回类型。快速查看库可能是sqldb *SQLiteConnsqldb *SQLiteContext

以上是关于Golang/gin:如何将 db 传递给路由器功能的主要内容,如果未能解决你的问题,请参考以下文章

Golang Gin 实战| 快速安装入门

Golang Gin 框架参数解析介绍

如何将状态传递给路由器组件?

如何将 QLineEdit 文本传递给 MS Access DB?

#yyds干货盘点# Golang Gin 框架上传介绍

Golang Gin 框架上传介绍