引用一个函数内的开放数据库连接 - Golang [英] Referring to an open database connection inside a function - Golang
问题描述
func main(){$ b $ db,err:= sql .Open(sqlite3,./house.db)
checkErr(err)
$ b $ ...
}
然后,我想创建一个函数,允许我根据传递的结构向数据库添加一行:
func addRow(row Room)error {
stmt,err:= db.Prepare(INSERT INTO Rooms(Name,Size,WindowCount,WallDecorationType, )
_,err = stmt.Exec(row.Name,row.Size,row.WindowCount,row.WallDecorationType,row.Floor)
return err
}
但显然我不能这样做,因为
addRow()
函数不知道db
是。
我将如何使这个功能起作用?或许我应该在主函数之外打开数据库?
解决方案根据应用程序的工作方式, p>
- 保留
db
全局
- 将
db
作为参数传递给
- make
addRoom
a 方法
我通常为API服务做的是创建一个 global
db
,如下所示:
var db * sql.DB
func main(){
var err错误
db,err = sql.Open(sqlite3,./house.db)
checkErr(err)
//创建房间房间{}
err = addRoom(房间)
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 有一些很好的例子。
My main function opens a database connection:
func main() { db, err := sql.Open("sqlite3", "./house.db") checkErr(err) ... }
Then, I want to create a function that allows me to add a row to the database based on a passed struct:
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 }
But obviously I can't do that because the
addRow()
function has no idea whatdb
is.How would I make this function work? Should I perhaps, open the database outside of the main function?
解决方案Depending on how your application works, you can either
- keep the
db
global- pass
db
as a parameter- make
addRoom
a methodWhat I typically do for API services is create a global
db
, like this: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) }
But you can also pass db as a parameter:
func addRow(db *sql.DB, row Room) error
Or you can create a
struct
which keeps the connection as an attribute and makesaddRow
a method:type dbConn struct { db *sql.DB } func (conn dbConn) addRow(row Room) error
This book has some nice examples.
这篇关于引用一个函数内的开放数据库连接 - Golang的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!