リレーショナルデータベースへのアクセス

Go を使用すると、アプリケーションに多種多様なデータベースとデータアクセスアプローチを組み込むことができます。このセクションのトピックでは、標準ライブラリのdatabase/sql パッケージを使用してリレーショナルデータベースにアクセスする方法について説明します。

Go を使用したデータアクセスに関する入門チュートリアルについては、チュートリアル: リレーショナルデータベースへのアクセスを参照してください。

Go は、リレーショナルデータベースへのより高レベルなアクセスを実現する ORM ライブラリや、非リレーショナルな NoSQL データストアなど、他のデータアクセス技術もサポートしています。

  • オブジェクトリレーショナルマッピング (ORM) ライブラリ。 database/sql パッケージには低レベルのデータアクセスロジック用の関数が含まれていますが、Go を使用してより高い抽象レベルでデータストアにアクセスすることもできます。Go 用の 2 つの人気のあるオブジェクトリレーショナルマッピング (ORM) ライブラリの詳細については、GORM (パッケージリファレンス) および ent (パッケージリファレンス) を参照してください。
  • NoSQL データストア。 Go コミュニティは、MongoDBCouchbase を含む、ほとんどの NoSQL データストア用のドライバを開発しました。詳細については、pkg.go.dev で検索してください。

サポートされているデータベース管理システム

Go は、MySQL、Oracle、Postgres、SQL Server、SQLite など、最も一般的なリレーショナルデータベース管理システムをすべてサポートしています。

ドライバの完全なリストは、SQLDrivers ページで確認できます。

クエリを実行したり、データベースを変更したりする関数

database/sql パッケージには、実行するデータベース操作の種類に合わせて特別に設計された関数が含まれています。たとえば、クエリの実行には Query または QueryRow を使用できますが、QueryRow は 1 行のみを期待する場合に設計されており、1 行のみを含む sql.Rows を返すオーバーヘッドを省きます。Exec 関数を使用すると、INSERTUPDATEDELETE などの SQL ステートメントでデータベースを変更できます。

詳細については、以下を参照してください。

トランザクション

sql.Tx を介して、トランザクションでデータベース操作を実行するコードを記述できます。トランザクションでは、複数の操作をまとめて実行し、すべての変更を 1 つのアトミックステップで適用する最終コミット、または破棄するロールバックで終了することができます。

トランザクションの詳細については、トランザクションの実行を参照してください。

クエリのキャンセル

クライアントの接続が閉じたり、操作が想定よりも長く実行されたりするなど、データベース操作をキャンセルする機能が必要な場合は、context.Context を使用できます。

任意のデータベース操作に対して、Context を引数として取る database/sql パッケージ関数を使用できます。Context を使用すると、操作のタイムアウトまたは期限を指定できます。また、Context を使用して、アプリケーションを通じてキャンセルリクエストを SQL ステートメントを実行する関数に伝播し、不要になったリソースが解放されるようにすることもできます。

詳細については、進行中の操作のキャンセルを参照してください。

管理された接続プール

sql.DB データベースハンドルを使用すると、コードのニーズに応じて接続を作成および破棄する組み込みの接続プールに接続します。sql.DB を介したハンドルは、Go でデータベースにアクセスする最も一般的な方法です。詳細については、データベースハンドルのオープンを参照してください。

database/sql パッケージは、接続プールを管理します。ただし、より高度なニーズについては、接続プールプロパティの設定で説明されているように、接続プールプロパティを設定できます。

単一の予約済み接続が必要な操作については、database/sql パッケージはsql.Conn を提供します。Conn は、sql.Tx を使用したトランザクションが不適切な選択である場合に特に便利です。

たとえば、コードは以下を行う必要がある場合があります。

  • 独自のトランザクションセマンティクスを含むロジックを含む DDL を介してスキーマ変更を行います。トランザクションの実行で説明されているように、sql パッケージのトランザクション関数と SQL トランザクションステートメントを混在させるのは悪い習慣です。
  • 一時テーブルを作成するクエリロック操作を実行します。

詳細については、専用接続の使用を参照してください。