2015-05-19 60 views
0

我是Go開發Web應用程序的新手。 我正在尋找將MySQL數據庫集成到我的Web應用程序中的最佳方法。將數據庫集成到Go Web應用程序的最佳方式

我的想法做這樣的:

type Context struct { 
    Database *sql.DB 
} 
// Some database methods like Close() and Query() for Context struct here 

在主要功能爲我的web應用程序,我會有這樣的事情:

db := sql.Open(...) 
ctx := Context{db} 

我會再傳給然後通過我的Context結構到需要數據庫連接的各種處理程序中。這是一個很好的設計決策,還是有更好的方法將SQL數據庫集成到我的Web應用程序中?

+0

這個問題似乎真的發表意見的。你問你沒寫過的代碼是否可以工作?有關指南,只需在網上搜索示例即可。最好的問題提供了一個特定的代碼示例,並有一個明確的問題需要解決。 – vastlysuperiorman

+0

大多數框架和示例僅使用全局變量,是的。 – 0x434D53

回答

0

我通常做這樣的事情:

package main 

func main(){ 
    db,err := sql.Open(...) 
    if err != nil { 
     log.Fatal(err) 
    } 
    defer db.Close() 
    http.HandleFunc("/feed", server.FeedHandler(db)) 
    http.HandleFunc("/gui", server.GuiHandler(db)) 
    ... 
    log.Fatal(http.ListenAndServe(":8000", nil)) 
} 

server是一個單獨的包,我定義,實現和測試我所有的HTTP處理程序。

這基本上是自己所想的,但跳躍包裹在一個結構是沒有必要的分貝的步驟。我會不是建議使db成爲一個全局變量。擁有全局依賴性將徹底摧毀以可靠方式測試您的http處理程序的任何可能性。

注入數據庫的依賴注入,如上例所示,每次調用該函數時都需要輸入兩個額外的字符,但它允許您使用go-sqlmock package輕鬆地測試您的http處理程序,而您必須使用go-sqlmock package作爲您的Web應用程序增長。

package server 

func TestFeedHandler(t *testing.T){ 
    mockdb, err := sqlmock.New() 
    if err != nil { 
     t.Errorf("An error '%s' was not expected when opening a stub database connection", err) 
    } 

    columns := []string{"id", "name"} 
    sqlmock.ExpectQuery("SELECT id,name from persons;"). 
     WillReturnRows(sqlmock.NewRows(columns). 
     AddRow(1234, "bob") 

    handler := FeedHandler(mockdb) 

    // test that handler returns expected result 

} 
相關問題