2017-08-15 116 views
-2

我应该在初始化数据库实例后将其存储在哪里?我想从请求处理程序访问它们。我应该在哪里存储全局数据库实例?

// 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)) 
} 

这只是主函数中的局部变量。我怎么能把它们暴露给处理程序的包?

回答

0

您可以将数据库连接包装在一个结构中,并让它返回您的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

相关问题