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

この記事では、Goを使用して一般的なSQLデータベース操作を実行する方法をリストします。

紹介database/sql

Goは、標準ライブラリでクリーンなSQLデータベースAPIを提供しますdatabase/sqlパッケージですが、特定のデータベースドライバを個別にインストールする必要があります。

これは、ほぼすべてのDBドライバーが実装する共通のインターフェイスを提供するため、スマートなアプローチです。

MySQLを使用したい場合は、https://github.com/go-sql-driver/mysql

PostgreSQLを使用している場合は、https://github.com/lib/pq

を使用してライブラリを含める必要がありますimport _、 そしてそのdatabase/sqlAPIは、そのドライバーを有効にするように構成されます。

import "database/sql"
import _ "github.com/go-sql-driver/mysql"

データベース接続を開きます

目標はそれを抽象化することですが、データベースへの接続方法など、いくつかの点でまだ違いがあります。

import "database/sql"
import _ "github.com/go-sql-driver/mysql"

//… db, err := sql.Open(“mysql”, “theUser:[email protected]/theDbName”) if err != nil { panic(err) }

import “database/sql”
import _ github.com/lib/pq

//… db, err := sql.Open(“postgres”, “user=theUser dbname=theDbName sslmode=verify-full”) if err != nil { panic(err) }

ただし、実際のAPIの多くはdbに依存せず、非常に簡単に交換できます(ここでは、SQLについては説明せず、データベースAPIを参照するだけです)。

データベース接続を閉じます

意味がある場合は、常にデータベース接続を閉じる必要があります。

いつものように使えますdeferデータベース接続を開く関数が終了したときにそれを閉じるには:

db, err := sql.Open("postgres", psqlInfo)
defer db.Close()

データベースからデータを抽出する

単一の行を選択します

テーブルのクエリは2つのステップで実行されます。最初に電話しますdb.QueryRow()、それからあなたは電話しますScan()結果に。

例:

id := 1
var col string
sqlStatement := `SELECT col FROM my_table WHERE id=$1`
row := db.QueryRow(sqlStatement, id)
err := row.Scan(&col)
if err != nil {
    if err == sql.ErrNoRows {
        fmt.Println("Zero rows found")
    } else {
        panic(err)
    }
}

db.QueryRow()テーブルから単一の値をクエリするために使用されます。

署名:

func (db *DB) QueryRow(query string, args ...interface{}) *Row

へのポインタを返しますdb.Row値。

(*Row) Scan行をスキャンし、渡されたパラメーターに列の値をコピーします。

署名:

func (r *Row) Scan(dest ...interface{}) error

複数の行が返された場合は、最初の行のみがスキャンされます残りは無視してください。

行が返されない場合は、ErrNoRowsエラー

var ErrNoRows = errors.New("sql: no rows in result set")

複数の行を選択

使用した単一の行をクエリするdb.QueryRow()。複数の行をクエリするには、db.Query()、を返します*Rows値。

ドキュメントから:

//Rows is the result of a query. Its cursor starts before  the first row of the result set. Use Next to advance through the rows:

    rows, err := db.Query("SELECT ...")
    ...
    defer rows.Close()
    for rows.Next() {
        var id int
        var name string
        err = rows.Scan(&id, &name)
        ...
    }
     err = rows.Err() // get any error encountered ing iteration
    ...

// Errは、反復中に発生したエラーがある場合はそれを返します。 // Errは、明示的または暗黙的なCloseの後に呼び出される場合があります。

繰り返す必要がありますrows.Next()、これにより、rows.Scan()ループに。

次の行の準備中にエラーが発生した場合、ループは終了し、を呼び出すことでエラーを取得できますrows.Err()

type Timeline struct {
    Id int
    Content string
}
rows, err := db.Query(`SELECT id, content FROM timeline`)
if err != nil {
    panic(err)
}
defer rows.Close()
for rows.Next() {
    timeline := Timeline{}
    err = rows.Scan(&timeline.Id, &timeline.Content)
    if err != nil {
        panic(err)
    }
    fmt.Println(timeline)
}
err = rows.Err()
if err != nil {
    panic(err)
}

その他のチュートリアル: