golang中的连接数据库

时间:2016-09-10 14:59:22

标签: model-view-controller go init

我可以在mvc structur golang(beego,revel)中初始化文件,如语言,连接数据库等吗?

我尝试在控制器中使用,但效果不佳。

一个好的解决方案是创建基本控制器并在这里放置所有init连接,语言等?还是有其他方式(更好)?

2 个答案:

答案 0 :(得分: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:pass@localhost/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)
    }
}

文件:models / 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
}

答案 1 :(得分:1)

我总是做一些包装,我保留了我的环境变量。

例如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目录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:password@tcp(127.0.0.1:3306)/test")
}

通过这种方式,您可以初始化数据库并通过注入env在应用的所有部分中使用它

  

当然,这个解决方案有一些缺点。首先,代码更难   思考,因为组件的依赖关系不清楚。第二,   测试这些组件变得更加困难,并且运行测试   并行几乎是不可能的。通过全局连接,可以进行测试   后端服务中的相同数据无法并行运行。

有一篇关于Dependency Injection with Go

的精彩文章

我希望你能找到这个有用的