2016-03-07 43 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