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

Anu*_*ope 4 sql database go

我的main函数打开一个数据库连接:

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

    ...
}
Run Code Online (Sandbox Code Playgroud)

然后,我想创建一个函数,允许我根据传递的结构向数据库添加一行:

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
}
Run Code Online (Sandbox Code Playgroud)

但显然我不能这样做,因为addRow()函数不知道是什么db.

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

Nev*_*ore 8

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

  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)
}
Run Code Online (Sandbox Code Playgroud)

但您也可以将db作为参数传递:

func addRow(db *sql.DB, row Room) error
Run Code Online (Sandbox Code Playgroud)

或者您可以创建一个struct将连接保持为属性并创建addRow方法的方法:

type dbConn struct {
    db *sql.DB
}

func (conn dbConn) addRow(row Room) error
Run Code Online (Sandbox Code Playgroud)

本书有一些很好的例子.