引用函数内部的开放数据库连接 - Golang

时间:2017-03-03 14:40:26

标签: sql database go

我的主要功能打开数据库连接:

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是什么。

我该如何使这个功能起作用?我应该在主函数之外打开数据库吗?

1 个答案:

答案 0 :(得分:7)

根据您的应用程序的工作方式,您可以

  1. 保持db 全球
  2. db作为参数
  3. 传递
  4. 使addRoom成为方法
  5. 我通常为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)
    }
    

    但您也可以将db作为参数

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

    或者您可以创建 struct ,将连接保留为属性,并使addRow成为方法:

    type dbConn struct {
        db *sql.DB
    }
    
    func (conn dbConn) addRow(row Room) error
    

    这个book有一些不错的例子。