Go の関数内でオープン データベース接続を参照する
Go でデータベースを操作する場合、データベースへの接続を確立するのが一般的ですmain 関数で接続し、アプリケーション全体でこの接続を利用します。しかし、データベース操作を関数内にカプセル化したい場合はどうなるでしょうか?
次のシナリオを考えてみましょう。 main 関数で、データベース接続を開きます:
<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() 関数は、main 関数で定義された 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 中国語 Web サイトの他の関連記事を参照してください。