在 Go 中的函数中引用开放数据库连接
在 Go 中使用数据库时,通常会建立与数据库的连接在主函数中,然后在整个应用程序中使用此连接。但是,当您想将数据库操作封装在函数中时会发生什么?
考虑以下场景。在主函数中,您打开一个数据库连接:
<code class="go">func main() { db, err := sql.Open("sqlite3", "./house.db") checkErr(err) ... }</code>
现在,您有兴趣创建一个根据传递的结构向数据库添加行的函数:
<code class="go">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 }</code>
但这里存在挑战:addRow() 函数不知道主函数中定义的 db 变量。
如何处理数据库连接引用
取决于根据应用程序的性质,您有多种选择在 addRow() 函数中引用数据库连接:
<code class="go">func addRow(db *sql.DB, row Room) error</code>
<code class="go">type dbConn struct { db *sql.DB } func (conn dbConn) addRow(row Room) error</code>
示例用法
让我们演示一下全局变量方法的用法:
<code class="go">var db *sql.DB func main() { db, err := sql.Open("sqlite3", "./house.db") checkErr(err) // create room Room{} err = addRow(room) checkErr(err) }</code>
通过将 db 声明为全局变量,程序中任何位置的 addRow() 函数都可以访问它。
请记住,您选择的方法应根据您的具体要求进行定制。应用程序、其架构和性能考虑因素。
以上是如何从 Go 中的函数访问数据库连接?的详细内容。更多信息请关注PHP中文网其他相关文章!