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 関数は main 関数の外部で定義されているため、db に直接アクセスできません。
解決策:
この状況を処理するには、いくつかの方法があります:
グローバル アクセス:
関数の外で宣言して 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 変数をパラメータとして渡します。 addRow 関数に追加します:
<code class="go">func addRow(db *sql.DB, row Room) error { stmt, err := db.Prepare("INSERT INTO Rooms (...)") ... return nil }</code>
このメソッドは、データベース接続のスコープをより詳細に制御し、より適切な依存関係の注入を可能にします。
Struct のメソッド:
もう 1 つのオプションは、データベース接続を格納する構造体のメソッドとして 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 中国語 Web サイトの他の関連記事を参照してください。