在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>
透過將全域變數方法的用法:
透過將dbdb 宣告為全域變量,程式中任何位置的addRow() 函數都可以存取它。 請記住,您選擇的方法應根據您的特定要求進行客製化。應用程式、其架構和效能考量。以上是如何從 Go 中的函數存取資料庫連接?的詳細內容。更多資訊請關注PHP中文網其他相關文章!