Go で SQL データベースを使用する方法
シンプルなデータベース抽象化パッケージを使用すると、Go から SQL を使用するのは思ったよりも簡単です。
SQL データベースは、データのコレクションを行と列に格納します。 SQL 言語を使用して、リレーショナル データベース管理システム (RDBMS) 内のデータを取得および更新できます。利用可能な多くの SQL データベースの中で、最も人気のあるものは MySQL、PostgreSQL、Microsoft SQL Server、および SQLite です。
Go でデータベースと対話するための機能は、標準ライブラリの一部である database/sql パッケージにあります。
Database/sql パッケージは、ドライバーを使用して SQL データベースと対話します。 RDBMS に適切なドライバー パッケージをインポートし、それを使用してデータベースと対話できます。
Go で SQL データベースを始める
Database/sql パッケージは、リレーショナル データベースへの汎用インターフェイスです。特定のデータベース サーバーを操作するには、利用可能な多数のドライバーの 1 つを使用する必要があります。
ありがたいことに、ドライバー以外の特定の実装について心配する必要はありません。 Database/sql パッケージは、接続先のサーバーとは独立してデータベース操作を処理します。
最も人気のある Go データベース ドライバーには次のようなものがあります。
- Go-SQL ドライバー (MySQL)
- PQ (PostgreSQL)
- Go-SQLite3 (SQLite)
- MSSQL DB (マイクロソフト SQL サーバー)
LibHunt ドライバー リストを使用して、他のデータベース タイプに相当するドライバーを見つけることができます。このリストには、各データベース システムの相対的な人気も示されています。
Go データベースドライバーのインストールとインポート
Go ワークスペースを作成し、Go モジュール ファイルを初期化したら、データベース システムに一致するドライバーをインストールします。たとえば、ワークスペース ディレクトリで次のコマンドのいずれかを実行して、MySQL または SQLite ドライバーをインストールします。
go get -u github.com/go-sql-driver/mysql
go get github.com/mattn/go-sqlite3
ドライバーをインストールした後、パッケージの前にアンダースコアを接頭辞として付けて、副作用を防ぐためにドライバーをインポートします。たとえば、MySQL ドライバーをデータベース/SQL パッケージと一緒にインポートするには、次のようにします。
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
副作用用のドライバー パッケージをインポートすると、それを使用してデータベースに接続し、操作を実行できます。
Go を使用して SQL データベースに接続する
データベース ドライバーをインポートした後、database/sql パッケージのOpen メソッドを使用してデータベース接続を作成できます。このメソッドは、ドライバーの名前とデータベースへのパス (SQLite の場合) または接続文字列 (MySQL の場合) を受け取ります。たとえば、次のいずれかを使用します。
db, err := sql.Open("sqlite3", "models/testdb.db") // SQLite
db, err := sql.Open("mysql", "user:password@/dbname") // MySQL
接続を開こうとした後は、必ずエラーを確認してください。
if err != nil {
log.Fatalln(err)
}
データベース システムによっては、データベースが存在しない場合、Open メソッドがエラーを返す場合があります。データベースに接続すると、Open が返すデータベース インスタンスを使用してクエリを実行し、ステートメントを準備できます。
SQLコマンドの実行
データベース インスタンスの準備メソッドを使用して SQL コマンドを実行できます。 Prepare メソッドは SQL コマンドを受け取り、エラー オブジェクトとともに実行するための準備されたステートメントを返します。たとえば、新しいテーブルを作成する場合は次のようにします。
command, err := db.Prepare("CREATE TABLE IF NOT EXISTS login(username TEXT, password TEXT)")
上記のステートメントは、login という名前のテーブルを作成します (まだ存在しない場合)。新しいテーブルには、ユーザー名とパスワードという名前のフィールドがあり、それぞれタイプがテキストです。
プログラムの値をクエリに挿入する場合は、疑問符 (?) 表記を使用してプレースホルダを示し、ステートメントの実行時にパラメータを渡すことができます。
command, err := db.Prepare("INSERT INTO login(username, password) values(?,?)")
準備されたステートメントを作成したら、Exec メソッドを使用して実行できます。このメソッドを使用すると、プログラムからパラメーター値を渡すことができます。
exec, err := command.Exec(value1, Value2)
if err != nil {
return
}
Exec() が返す最初の値は、データベースに対する SQL クエリの結果です。このクエリ結果を使用して、影響を受ける行数または最後に挿入された ID を確認できます。
affected, err := exec.RowsAffected()
if err != nil {
return
}
fmt.Println(affected)
id, err := exec.LastInsertId()
if err != nil {
return
}
fmt.Println(id)
クエリ結果の取得
Database/sql パッケージを使用すると、データベース インスタンスのクエリ メソッドを使用してデータベース結果をクエリできます。
rows, err := db.Query("SELECT * FROM User")
if err != nil {
return
}
Query メソッドは、結果セットの操作に使用できる行 構造体を返します。たとえば、行インスタンスのNext メソッドを使用して反復し、個々の行を操作できます。
var username, password string
for rows.Next() {
err := rows.Scan(&username, &password)
if err != nil {
log.Fatalln(err)
}
fmt.Println(username, password)
}
上の例では、ユーザー名とパスワードという 2 つの文字列変数が各列の値を表します。 Scan メソッドは、現在の行を対応する変数にデコードします。
SQL データベースは常に便利です
Go でのデータベースの使用は、database/sql パッケージを使用することで簡単に行えます。これを使用すると、Go で SQL コマンドを簡単にクエリおよび実行できます。
SQL データベースは、多くのアプリケーション、特に大規模または複雑なデータセットを扱うアプリケーションの中核です。 Web スクレイピングやボットの構築などの単純なプロジェクトには、インメモリ SQLite データベースなどのデータベースを使用できます。
SQL およびデータベース管理システムをプログラムで効率的に使用するには、SQL およびデータベース管理システムに関する適切な知識が不可欠です。ただし、SQL を学習しないことを選択した場合は、ORM を使用して Go で SQL データベースと対話する方法を学ぶことができます。