我的主要功能是打开数据库连接:
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是什么。
addRow()
db
我如何使此功能起作用?我是否应该在主要功能之外打开数据库?
根据您的应用程序的工作方式,您可以
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方法的方法:
struct
addRow
type dbConn struct { db *sql.DB } func (conn dbConn) addRow(row Room) error
这本书有一些很好的例子。