我的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.
我该如何使这个功能起作用?我是否应该在主要功能之外打开数据库?
根据应用程序的工作方式,您也可以
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)
}
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)
这本书有一些很好的例子.