在go中初始化数据库实例后,我应该在哪里存储?我想从请求处理程序中访问它们。
// server.go
storage, err := config.GetFileStorage(viper.GetViper())
if err != nil {
log.Fatal(fmt.Sprintf("Failed to configure the file storage: %v\n", err))
}
db, err := config.GetDatabase(viper.GetViper())
if err != nil {
log.Fatal(fmt.Sprintf("Failed to configure the database: %v\n", err))
}
这只是main函数中的局部变量。我怎么能把它们暴露在带有处理程序的go包中?
答案 0 :(得分:0)
您可以将DB连接包装在结构中,并让它返回您的http处理程序。像这样:
package main
import (
"database/sql"
"log"
"net/http"
)
type DBManager struct {
db *sql.DB
}
func (m *DBManager) HelloHandler() http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
rows, err := m.db.Query("SELECT hello FROM world")
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
defer rows.Close()
for rows.Next() {
// do stuff
}
})
}
func main() {
db, err := sql.Open("", "")
if err != nil {
panic(err)
}
m := DBManager{db: db}
http.Handle("/", m.HelloHandler())
log.Fatal(http.ListenAndServe(":8080", nil))
}
还要确保您的对象可以处理* sql.DB https://golang.org/pkg/database/sql/#DB
等并发访问如果您希望/需要在处理程序之间共享更多内容,可以查看环境模式:http://www.jerf.org/iri/post/2929