从 Golang 中的函数内访问数据库连接
在 Golang 中,数据库操作通常从打开到数据库的连接开始。但是,在使用需要数据库交互的函数时,通常需要引用打开的连接。
问题:
考虑以下场景:
<code class="go">func main() { db, err := sql.Open("sqlite3", "./house.db") checkErr(err) addRow(Room{ Name: "Bedroom", Size: 12.5, ... }) }</code>
在这个例子中,main函数打开一个数据库连接,用db表示。但是,addRow 函数无法直接访问 db,因为它是在 main 函数之外定义的。
解决方案:
有几种方法可以处理这种情况:
全局访问:
通过在任何函数外部声明 db 变量使其成为全局变量,例如:
<code class="go">var db *sql.DB func main() { db, err := sql.Open("sqlite3", "./house.db") checkErr(err) addRow(Room{ Name: "Bedroom", Size: 12.5, ... }) }</code>
此方法允许内部的所有函数访问 db 变量的相同包。但是,不建议长时间运行的应用程序使用全局变量,因为全局变量可能会导致资源泄漏和意外行为。
参数传递:
将 db 变量作为参数传递添加行函数:
<code class="go">func addRow(db *sql.DB, row Room) error { stmt, err := db.Prepare("INSERT INTO Rooms (...)") ... return nil }</code>
此方法提供了对数据库连接范围的更多控制,并允许更好的依赖注入。
Struct 方法:
另一种选择是将 addRow 定义为存储数据库连接的结构体的方法:
<code class="go">type Database struct { db *sql.DB } func (db *Database) AddRow(row Room) error { stmt, err := db.db.Prepare("INSERT INTO Rooms (...)") ... return nil }</code>
这种方法封装了数据库连接并提供了一种更结构化的访问它的方式。
以上是如何从 Golang 函数内访问数据库连接?的详细内容。更多信息请关注PHP中文网其他相关文章!