🎉

Go言語でのSQLデータベース操作

2024/09/18に公開

はじめに

このページではGo言語を使用してSQLデータベースに接続し、データの操作を行う方法について記述します。

Go言語でのSQLデータベース操作

Go言語でSQLデータベースを操作するためには、標準ライブラリのdatabase/sqlパッケージを使用します。このパッケージはデータベースへの接続やクエリの実行、トランザクションの処理などを行うためのインターフェースを提供します。また、具体的なデータベースドライバも必要です。例えば、MySQLの場合はgithub.com/go-sql-driver/mysqlを使用します。

以下では、GoでSQLデータベースを操作する基本的な手順をいくつかの例を通して説明します。

1. 必要なパッケージのインポート

まず、GoでSQLを扱うために必要なパッケージをインポートします。

import (
    "database/sql"
    "fmt"
    "log"

    _ "github.com/go-sql-driver/mysql"
)

_ "github.com/go-sql-driver/mysql"の部分はMySQLのドライバをインポートしています。アンダースコア_を使うことで、このパッケージのinit()関数のみが実行され、database/sqlがこのドライバを使用できるようになります。

2. データベースへの接続

データベースへの接続はsql.Open関数を使用します。この関数はデータベースドライバ名と接続文字列を引数に取り、*sql.DBオブジェクトを返します。

func connectDB() (*sql.DB, error) {
    // ユーザー名:パスワード@tcp(ホスト:ポート)/データベース名
    dsn := "user:password@tcp(127.0.0.1:3306)/testdb"
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        return nil, err
    }

    // 実際に接続できるかを確認
    err = db.Ping()
    if err != nil {
        return nil, err
    }

    return db, nil
}

この関数では、sql.Openでデータベースに接続し、db.Ping()で実際に接続できるかどうかを確認しています。

3. データのクエリ実行

データベースへの接続が確立されたら、データのクエリを実行できます。例えば、SELECT文を使用してデータを取得する場合は、db.Queryメソッドを使用します。

func queryData(db *sql.DB) {
    rows, err := db.Query("SELECT id, name FROM users")
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()

    for rows.Next() {
        var id int
        var name string
        if err := rows.Scan(&id, &name); err != nil {
            log.Fatal(err)
        }
        fmt.Printf("ID: %d, Name: %s\n", id, name)
    }
}

db.Query*sql.Rowsを返します。取得したデータはrows.Next()を使用して1行ずつ読み込み、rows.Scanで各カラムの値を変数にコピーします。

4. データの挿入、更新、削除

データの挿入、更新、削除にはdb.Execメソッドを使用します。以下はデータの挿入例です。

func insertData(db *sql.DB) {
    result, err := db.Exec("INSERT INTO users (name) VALUES (?)", "John Doe")
    if err != nil {
        log.Fatal(err)
    }

    id, err := result.LastInsertId()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Inserted record ID: %d\n", id)
}

db.Execsql.Resultを返し、これを使って挿入されたレコードのIDや影響を受けた行数を取得することができます。

5. トランザクションの使用

複数の操作を一つのトランザクションとしてまとめる場合は、db.Beginでトランザクションを開始し、CommitまたはRollbackを使用します。

func transactionExample(db *sql.DB) {
    tx, err := db.Begin()
    if err != nil {
        log.Fatal(err)
    }

    _, err = tx.Exec("INSERT INTO users (name) VALUES (?)", "Alice")
    if err != nil {
        tx.Rollback()
        log.Fatal(err)
    }

    _, err = tx.Exec("INSERT INTO users (name) VALUES (?)", "Bob")
    if err != nil {
        tx.Rollback()
        log.Fatal(err)
    }

    err = tx.Commit()
    if err != nil {
        log.Fatal(err)
    }
}

トランザクション中にエラーが発生した場合、Rollbackを呼び出して変更を取り消します。すべての操作が成功した場合にのみ、Commitを呼び出して変更を確定します。

6. データベース接続のクローズ

プログラムの終了時にはdb.Closeを呼び出してデータベース接続を閉じることを忘れないようにしましょう。

defer db.Close()

まとめ

Go言語でSQLデータベースを操作するためには、database/sqlパッケージを使用し、データベースドライバをインポートする必要があります。基本的な操作として、データの接続、クエリ実行、データの挿入、更新、削除、トランザクションの使用方法を学びました。これらの操作を組み合わせて、Goで強力なデータベース操作を行うことができます。

詳細はGoの公式ドキュメントを参照してください: Go database/sql パッケージ.

Discussion