リレーショナルデータベースへのアクセス
Goを使用すると、アプリケーションにさまざまなデータベースとデータアクセスアプローチを組み込むことができます。このセクションのトピックでは、標準ライブラリのdatabase/sql
パッケージを使用してリレーショナルデータベースにアクセスする方法について説明します。
Goを使用したデータアクセスの入門チュートリアルについては、チュートリアル:リレーショナルデータベースへのアクセスを参照してください。
Goは、リレーショナルデータベースへのより高度なアクセスのためのORMライブラリ、および非リレーショナルNoSQLデータストアを含む、他のデータアクセステクノロジーもサポートしています。
- オブジェクトリレーショナルマッピング(ORM)ライブラリ。
database/sql
パッケージには低レベルのデータアクセスロジックの関数が含まれていますが、Goを使用してより高い抽象化レベルでデータストアにアクセスすることもできます。Goで人気のある2つのオブジェクトリレーショナルマッピング(ORM)ライブラリについては、GORM(パッケージリファレンス)とent(パッケージリファレンス)を参照してください。 - NoSQLデータストア。Goコミュニティは、MongoDBやCouchbaseを含む、ほとんどのNoSQLデータストアのドライバーを開発しています。pkg.go.devでさらに検索できます。
サポートされているデータベース管理システム
Goは、MySQL、Oracle、Postgres、SQL Server、SQLiteなど、最も一般的なリレーショナルデータベース管理システムをすべてサポートしています。
SQLDriversページで、ドライバーの完全なリストを確認できます。
クエリを実行したり、データベースに変更を加える関数
database/sql
パッケージには、実行しているデータベース操作の種類に特化した関数が含まれています。たとえば、クエリを実行するにはQuery
またはQueryRow
を使用できますが、QueryRow
は1行だけを期待する場合に設計されており、1行のみを含むsql.Rows
を返すオーバーヘッドを省略します。INSERT
、UPDATE
、DELETE
などのSQLステートメントでデータベースに変更を加えるには、Exec
関数を使用できます。
詳細については、以下を参照してください。
トランザクション
sql.Tx
を使用して、トランザクションでデータベース操作を実行するコードを作成できます。トランザクションでは、複数の操作をまとめて実行し、最終的なコミット(すべての変更を1つのアトミックステップで適用する)またはロールバック(変更を破棄する)で終了できます。
トランザクションの詳細については、トランザクションの実行を参照してください。
クエリのキャンセル
クライアントの接続が閉じられた場合や、操作が想定時間より長く実行された場合など、データベース操作をキャンセルする機能が必要な場合は、context.Context
を使用できます。
データベース操作には、Context
を引数として取るdatabase/sql
パッケージ関数を使用できます。Context
を使用して、操作のタイムアウトまたは期限を指定できます。また、Context
を使用して、アプリケーションからSQLステートメントを実行する関数までキャンセル要求を伝達し、必要なくなった場合はリソースを解放できます。
詳細については、進行中の操作のキャンセルを参照してください。
管理された接続プール
sql.DB
データベースハンドルを使用すると、コードのニーズに応じて接続を作成および破棄する組み込み接続プールを使用して接続します。sql.DB
を使用したハンドルは、Goでデータベースアクセスを行う最も一般的な方法です。詳細については、データベースハンドルのオープンを参照してください。
database/sql
パッケージは接続プールを自動的に管理します。ただし、高度なニーズについては、接続プールプロパティの設定で説明されているように、接続プールプロパティを設定できます。
単一の予約済み接続が必要な操作の場合、database/sql
パッケージはsql.Conn
を提供します。sql.Tx
を使用したトランザクションが適切でない場合に、Conn
は特に便利です。
たとえば、コードでは次のことが必要になる場合があります。
- 独自のトランザクションセマンティクスを含むロジックを含むDDL(データ定義言語)を通じてスキーマ変更を行う。 トランザクションの実行で説明されているように、SQLパッケージトランザクション関数とSQLトランザクションステートメントを混在させることは適切な方法ではありません。
- 一時テーブルを作成するクエリロック操作を実行する。
詳細については、専用接続の使用を参照してください。