この記事では、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/sql
APIは、そのドライバーを有効にするように構成されます。
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)
}
その他のチュートリアル:
- NGINXリバースプロキシを使用してGoサービスを提供する
- Goで構造体のコピーを作成する
- GoWebサーバーの基本
- Goでのマップタイプの並べ替え
- 一言で言えばポインタを移動します
- タグの説明に行く
- 日付と時刻のフォーマットに移動
- Goを使用したJSON処理
- 可変個引数関数に移動
- GoStringsチートシート
- GoEmptyインターフェイスの説明
- Go withVSCodeとDelveのデバッグ
- NamedGoはパラメータを返します
- Goで乱数と文字列を生成する
- Goプロジェクトのファイルシステム構造
- Goに実装された二分探索アルゴリズム
- Goでのコマンドラインフラグの使用
- GOPATHの説明
- Goでコマンドラインアプリを作成する:lolcat
- Goを使用したCLIコマンドの作成:cowsay
- Goでのシェルパイプの使用
- CLIチュートリアルに移動:フォーチュンクローン
- Goを使用してフォルダ内のファイルを一覧表示します
- Goを使用して、GitHubからリポジトリのリストを取得します
- 移動し、文字列のスライスをファイルに追加します
- 文字列をバイトスライスに変換します
- GoでローカルGitの貢献を視覚化する
- GoCPUとメモリプロファイリングの開始
- Goプログラムの「インデックス作成をサポートしていません」エラーを解決する
- Goプログラムでの実行時間の測定
- 重複するタイトルを検出するためにGoを使用してWebクローラーを構築する
- ベストプラクティスに進む:ポインターまたは値のレシーバー?
- ベストプラクティスに進む:メソッドまたは関数を使用する必要がありますか?
- データ構造の移動:設定
- マップのチートシートに移動
- Goでジェネリック型の実装を生成する
- Goデータ構造:辞書
- Goデータ構造:ハッシュテーブル
- Go throughChannelsにイベントリスナーを実装する
- Goデータ構造:スタック
- データ構造の移動:キュー
- Goデータ構造:二分探索木
- Goデータ構造:グラフ
- Goデータ構造:リンクリスト
- Goデータ構造の完全ガイド
- Go値の比較
- Goはオブジェクト指向ですか?
- GoでのSQLデータベースの操作
- Goでの環境変数の使用
- チュートリアルに進む:PostgreSQLに裏打ちされたREST API
- GoWebサーバーでのCORSの有効化
- DockerコンテナへのGoアプリケーションのデプロイ
- GoがPHP開発者として学ぶための強力な言語である理由
- 移動し、io.Reader.ReadString改行文字を削除します
- 移動、変更を監視してプログラムを再構築する方法
- 行って、日付からの月を数えます
- GoでHTTPPOSTパラメーターにアクセスする