英文:
Golang/gin: How to Pass db to router functions
问题
我正在使用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)
...
如何通过路由处理程序函数PostSignin(c *gin.Context)
传递db值?
这样我就可以避免在每个函数中每次打开和关闭数据库。
更新:我正在使用go-sqlite3包。
谢谢!
英文:
I'm using gin framework. And I'm opening the sqlite database in the main function like this
func main() {
...
db, err := sql.Open("sqlite3", "./libreread.db")
CheckError(err)
defer db.Close()
...
}
And I have these router handlers in the main function.
...
r.GET("/", GetHomePage)
r.GET("/signin", GetSignIn)
r.POST("/signin", PostSignIn)
...
How to pass that db value through the router handler func PostSignin(c *gin.Context)
?
So that I could avoid opening and closing the database each time in the functions.
UPDATE: I'm using go-sqlite3 package.
Thanks!
答案1
得分: 2
假设你已经在db
中初始化了你的SQL客户端,然后你可以将它传递给不同的路由:
r.GET("/", GetHomePageHandler(&db))
在你的GetHomePageHandler
函数中:
func GetHomePageHandler(sqldb *SQLiteConn) func (*gin.Context) {
return func (*gin.Context) {
// ...
}
}
其中*SQLiteConn
是你的SQL数据库实例的类型。我不知道你目前使用的是哪个包,所以这只是一个示例。
你还可以在这个答案中找到一种更优雅的解决方法。
英文:
Let's say you have your sql client initialized in db
, then, you can pass it to different routes with
r.GET("/", GetHomePageHandler(&db))
And in your GetHomePageHandler:
func GetHomePageHandler(sqldb *SQLiteConn) func (*gin.Context) {
return func (*gin.Context) {
. . .
}
}
Where *SQLiteConn
is the type of your sql db instance. I don't know which package you are currently using so this is just an example.
You can find also a more elegant way of solving it in this answer,
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论