ここでは、mvc structur golang(beego、revel)に言語、接続データベースなどの初期化ファイルを置くことができますか?golangの接続DB
私はコントローラで使用しようとしましたが、それは良くありません。
良い解決策は、ベースコントローラを作成し、ここにすべてのinit接続、言語などを入れることですか?または他の方法(より良い)がありますか?
ここでは、mvc structur golang(beego、revel)に言語、接続データベースなどの初期化ファイルを置くことができますか?golangの接続DB
私はコントローラで使用しようとしましたが、それは良くありません。
良い解決策は、ベースコントローラを作成し、ここにすべてのinit接続、言語などを入れることですか?または他の方法(より良い)がありますか?
私はいつも私の環境変数を保持するいくつかの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
を注入することによって、あなたのアプリケーションのすべての部分でそれを使用することができます。この方法もちろんこのソリューションにはいくつかの欠点があります。まず、コンポーネントの依存関係が不明確であるため、コードは に難しくなります。第二に、 これらのコンポーネントをテストするのが難しくなり、並列実行 でテストを実行することはほぼ不可能です。グローバル接続では、バックエンドサービス内の同じデータを同じデータである で並列実行することはできませんでした。
についての素晴らしい記事があり、私はあなたがグローバル変数を使用することができ、この参考になっ
を見つけることを願っていますが、私はそれを行うにはお勧めしません。データベースロジックが複数のパッケージに分散している、より複雑なアプリケーションではどうなりますか?これは、依存性注入を使用することをお勧めします:
ファイル: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
}