2016-09-10 17 views
1

ここでは、mvc structur golang(beego、revel)に言語、接続データベースなどの初期化ファイルを置くことができますか?golangの接続DB

私はコントローラで使用しようとしましたが、それは良くありません。

良い解決策は、ベースコントローラを作成し、ここにすべてのinit接続、言語などを入れることですか?または他の方法(より良い)がありますか?

答えて

1

私はいつも私の環境変数を保持するいくつかのpackegaをします。 env.go

package env 

import (
    "database/sql" 

    _ "github.com/go-sql-driver/mysql" 
) 

var (
    DB  *sql.DB 
) 

func connectToDB(dbURL string) *sql.DB { 
    conn, err := sql.Open("mysql", dbURL) 
    //check for err 

    return conn 
} 

func init() { 
    DB = connectToDB("root:[email protected](127.0.0.1:3306)/test") 
} 

main.go

package main 

import (
    "net/http" 
    env "github.com/vardius/example/enviroment" 
) 

func main() { 
    //some extra code here, http srever or something 
    defer env.DB.Close() 
} 

エンドenviroment内部DIR例えば

あなたのDB一度初期化およびenv

を注入することによって、あなたのアプリケーションのすべての部分でそれを使用することができます。この方法

もちろんこのソリューションにはいくつかの欠点があります。まず、コンポーネントの依存関係が不明確であるため、コードは に難しくなります。第二に、 これらのコンポーネントをテストするのが難しくなり、並列実行 でテストを実行することはほぼ不可能です。グローバル接続では、バックエンドサービス内の同じデータを同じデータである で並列実行することはできませんでした。

Dependency Injection with Go

についての素晴らしい記事があり、私はあなたがグローバル変数を使用することができ、この参考になっ

2

を見つけることを願っていますが、私はそれを行うにはお勧めしません。データベースロジックが複数のパッケージに分散している、より複雑なアプリケーションではどうなりますか?これは、依存性注入を使用することをお勧めします:

ファイル:main.go

package main 

import (
    "bookstore/models" 
    "database/sql" 
    "fmt" 
    "log" 
    "net/http" 
) 

type Env struct { 
    db *sql.DB 
} 

func main() { 
    db, err := models.NewDB("postgres://user:[email protected]/bookstore") 
    if err != nil { 
     log.Panic(err) 
    } 
    env := &Env{db: db} 

    http.HandleFunc("/books", env.booksIndex) 
    http.ListenAndServe(":3000", nil) 
} 

func (env *Env) booksIndex(w http.ResponseWriter, r *http.Request) { 
    if r.Method != "GET" { 
     http.Error(w, http.StatusText(405), 405) 
     return 
    } 
    bks, err := models.AllBooks(env.db) 
    if err != nil { 
     http.Error(w, http.StatusText(500), 500) 
     return 
    } 
    for _, bk := range bks { 
     fmt.Fprintf(w, "%s, %s, %s, £%.2f\n", bk.Isbn, bk.Title, bk.Author, bk.Price) 
    } 
} 

ファイル:モデル/ db.go

package models 

import (
    "database/sql" 
    _ "github.com/lib/pq" 
) 

func NewDB(dataSourceName string) (*sql.DB, error) { 
    db, err := sql.Open("postgres", dataSourceName) 
    if err != nil { 
     return nil, err 
    } 
    if err = db.Ping(); err != nil { 
     return nil, err 
    } 
    return db, nil 
}