ウェブサイト検索

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 データベースと対話する方法を学ぶことができます。

関連記事: