2017-03-03 27 views
2

我的主要功能打開一個數據庫連接:參考函數內部的開放數據庫連接 - Golang

func main() { 
    db, err := sql.Open("sqlite3", "./house.db") 
    checkErr(err) 

    ... 
} 

然後,我想創建一個可以讓我去行添加到基於一個數據庫通過結構:

func addRow(row Room) error { 
    stmt, err := db.Prepare("INSERT INTO Rooms (Name, Size, WindowCount, WallDecorationType, Floor) VALUES(?, ?, ?, ?, ?)") 
    _, err = stmt.Exec(row.Name , row.Size , row.WindowCount , row.WallDecorationType , row.Floor) 
    return err 
} 

但很明顯,我不能這樣做,因爲addRow()函數不知道什麼db是。

我該如何讓這個功能起作用?或許,我應該在主函數之外打開數據庫嗎?

+0

你不能在參數中傳遞'db'嗎? –

+0

使用全局'db'或將其作爲參數傳遞。 – JimB

+1

相關/可能的重複[如何處理在Go應用程序中打開/關閉Db連接?](http://stackoverflow.com/questions/40587008/how-do-i-handle-opening-closing-db-connection -in-a-go-app/40587071#40587071) – icza

回答

4

取決於應用程序如何工作,你可以

  1. 保持db全球
  2. db作爲參數
  3. 使addRoom一個方法

我通常爲API服務要做的就是創建一個全球db,像這樣:

var db *sql.DB 

func main() { 
    var err error 
    db, err = sql.Open("sqlite3", "./house.db") 
    checkErr(err) 
    // create room Room{} 
    err = addRoom(room) 
    checkErr(err) 
} 

但你也可以通過分貝爲參數

func addRow(db *sql.DB, row Room) error 

或者你可以創建一個struct它保留連接作爲屬性,並使得addRow的方法:

type dbConn struct { 
    db *sql.DB 
} 

func (conn dbConn) addRow(row Room) error 

這個book有一些很好的例子。

+0

這很好,謝謝。 – Anurope