我的主要功能打开数据库连接:
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
是什么。
我该如何使这个功能起作用?我应该在主函数之外打开数据库吗?
答案 0 :(得分:7)
根据您的应用程序的工作方式,您可以
db
全球 db
作为参数 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有一些不错的例子。