Tutorial: Accessing a relational database
このチュートリアルでは、Goとその標準ライブラリのdatabase/sqlパッケージを使用してリレーショナルデータベースにアクセスするための基本を紹介します。
使用database/sqlするパッケージには、データベースへの接続、トランザクションの実行、進行中の操作のキャンセルなどのタイプと関数が含まれています。パッケージの使用の詳細については、 データベースへのアクセスを参照してください。
このチュートリアルでは、データベースを作成してから、データベースにアクセスするためのコードを記述します。サンプルプロジェクトは、ビンテージジャズレコードに関するデータのリポジトリになります。
mkdir Go_Accessing_RDB
cd Go_Accessing_RDB
go mod init example/data-accessここでは、Docker でコンテナ化した MySQL を使ってアクセスする。
database name:
mysql> create database recordings;test data table:
DROP TABLE IF EXISTS album;
CREATE TABLE album (
id INT AUTO_INCREMENT NOT NULL,
title VARCHAR(128) NOT NULL,
artist VARCHAR(255) NOT NULL,
price DECIMAL(5,2) NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO album
(title, artist, price)
VALUES
('Blue Train', 'John Coltrane', 56.99),
('Giant Steps', 'John Coltrane', 63.99),
('Jeru', 'Gerry Mulligan', 17.99),
('Sarah Vaughan', 'Sarah Vaughan', 34.98);go/SQLDrivers より環境に合ったドライバーをインポートする。
ここでは、MySQL を利用しているので、Go-MySQL-Driver を main.go のインポートに追加。
*sql.DB : DB データベースハンドル
ここでは単純化のためにグローバル変数にしてるが、本番環境では変数として渡すかまたは struct でラップするなどして、グローバル変数を避けた実装をすべき。
DB に接続できることを DB.Ping で確認。
レコードの構造体の定義
type Album struct {
ID int64
Title string
Artist string
Price float32
}DB.Queryで複数行の返却- 構造体のフィールド名とタイプは、データベースの列の名前とタイプに対応しています。
- ループの後、
rows.Errを使用して、クエリ全体からのエラーを確認します。クエリ自体が失敗した場合、ここでエラーをチェックすることが、結果が不完全であることを確認する唯一の方法であることに注意してください。(?)
DB.QueryRowで単一行の返却- ここではコードの単純化のために
DB.QueryRowからのエラーを処理せずに、Row.Scan時に、sql.ErrNoRowsをチェックしてます。
INSERTステートメントを実行するためにDB.Exec使用Result.LastInsertId挿入されたデータベース行のIDを取得