在狂欢中全局变出init.go

时间:2016-03-07 01:04:34

标签: mysql go revel

(编辑修复大写并添加上下文)

在revel的init.go中,我有一个全局var:DB。

package app

import (
 "database/sql"
 "fmt"

 _ "github.com/go-sql-driver/mysql"
 "github.com/revel/revel"
)
var DB *sql.DB

func InitDB() {

 connstring := fmt.Sprintf("revel:revel@tcp(localhost:3336)/revel")

 var err error
 DB, err = sql.Open("mysql", connstring)
 if err != nil {
    revel.INFO.Println("DB Error", err)
 }

}

如何在应用程序的其余部分中获取该db变量?具体来说,我打算在模型中使用这个var。

首先,我如何让它在这个控制器中工作? 控制器/ app.go

package controller

func (c App) Index() revel.Result {
 rows, err := app.DB.Exec("SELECT * FROM test_table")
 //do something with rows
 return c.Render()
}

1 个答案:

答案 0 :(得分:1)

Revel让你“滚动你自己的数据库”,因此由你决定连接的位置以及如何实现它们。

您的InitDB()功能必须设置 公开 变量,例如DB(意思是它的名称大写),然后您将通过其所在的包访问它。

请注意,app/init.go位于package app内:

package app

var DB *sql.DB

func InitDB() { DB = .... }

在Go中,当您的应用程序运行时,每个程序包都充当一种“单例”,以便您访问的应用程序中的任何其他位置:

app.DB

这将在DB包中查找名为app的变量。如果您已经运行InitDB()来连接数据库,那么app.DB将允许所有其他包使用该数据库。