我应该在哪里存储全局数据库实例?

时间:2017-08-15 10:04:37

标签: database go global-variables

在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包中?

1 个答案:

答案 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