2017-08-15 106 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

相關問題