2016-03-07 30 views
0

(EDITING修复大小写并添加上下文)全局var out out中的init.go

在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:[email protected](localhost:3336)/revel") 

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

} 

如何在应用程序的其余部分获取该数据库变量?具体来说,我打算在模型中使用这个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() 
} 
+0

这是在'包主'或库? – elithrar

+0

它在包应用程序(init.go文件)中。我试图访问,是在任何地方。 – Chemdream

+0

在同一个包中只需调用db.Query(或其他方法),如果需要从另一个包中访问它,则需要将其导出为'DB'.小写变量是私有的 – elithrar

回答

1

狂欢让你“滚你自己的分贝”,所以它的你在那里连接且如何实现它们。

InitDB()函数必须设置一个公共变量,例如DB(意味着它的名字是大写),您将然后通过它生活在包访问

所以注意到你的app/init.gopackage app内:

package app 

var DB *sql.DB 

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

在走,当你的应用程序正在运行的每个包装作为一种“单”,以便在应用程序中其他地方,你访问:

app.DB 

这将寻找在app包称为DB变量年龄。如果您已经运行了InitDB()来连接数据库,那么app.DB将允许所有其他软件包使用该数据库。

+0

对不起,我不确定我的理解,预订不会在init.go文件中启动数据库。 – Chemdream

+1

Hiya @Chemdream我已经更新了答案,对你的案例非常具体。希望有所帮助! – charneykaye

+0

谢谢你的帮助。它仍然不适合我。我现在得到:: undefined:app.DB中的应用程序... 我更新了上面的代码以及包含我的包声明。谢谢! – Chemdream