2017-08-15 21 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)) 
} 

これは、main関数のローカル変数です。どのようにすれば、ハンドラを使って今すぐにそれらをパッケージに公開できますか?

答えて

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

また、あなたはハンドラ間でよりを共有する/必要性をしたい場合は、環境パターンを見てみることができますhttps://golang.org/pkg/database/sql/#DB

あなたのオブジェクトは* sql.DBのような同時アクセスを処理できることを確認してください:http://www.jerf.org/iri/post/2929

関連する問題