一尘不染

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

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

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


阅读 240

收藏
2020-07-02

共1个答案

一尘不染

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

  1. 保持db 全球
  2. db作为 参数* 传递 *
  3. addRoom一个 方法

我通常为API服务所做的是创建一个 global 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

本书有一些很好的例子。

2020-07-02