【问题标题】:Referring to an open database connection inside a function - Golang引用函数内打开的数据库连接 - Golang
【发布时间】:2017-03-03 14:40:25
【问题描述】:

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

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

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

【问题讨论】:

标签: sql database go


【解决方案1】:

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

  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)
}

但您也可以将 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 有一些很好的例子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    相关资源
    最近更新 更多