Go言語操作MySQLのSQLXパッケージ
友情のヒント:この文章は约14分5秒読む必要があります.足りないところはよろしくお愿いします.読んでくれてありがとう.当駅を購読する
SQLXライブラリ
このライブラリは
このライブラリには、次の4つの処理タイプがあります.
次の2つのカーソル・タイプを指定します.
SQLXライブラリのインストール
操作の使用
データベースの接続
データ表現と参照
ここでは、事前にユーザー構造体
クエリー操作
1行のデータの問合せ
クエリ1行のデータは、
複数行データの問合せ
複数行のデータをクエリーするには、
操作の挿入、更新、削除
挿入アクション
更新アクション
アクションの削除
パラメータバインド
ライブラリで最も一般的に使用される関数は、クエリー・パラメータの名前付けとバインドを実行する
NamedQuery
NamedExec
取引アクション
トランザクション操作は、
サンプルコード:
オープンソースのサポート
最後にこのオープンソースプロジェクトをここに置いて、皆さんが興味があれば、このオープンソースプロジェクトにスターをあげることができます.ありがとうございます.
GitHub jmoiron/sqlx
参考記事 https://github.com/jmoiron/sqlx http://jmoiron.github.io/sqlx/ sqlxライブラリ使用ガイド–李文周のブログ
SQLXライブラリ
sqlx
はGoのパッケージであり、database/sql
のパッケージを内蔵した優れた拡張機能を提供しています.このライブラリは
sql
オリジナルパッケージと互換性があり、より強力で優雅なクエリー、挿入関数を提供します.このライブラリには、次の4つの処理タイプがあります.
sqlx.DB
–原生のsql.DB
に類似する.sqlx.Tx
–原生のsql.Tx
に類似する.sqlx.Stmt
–オリジナルのsql.Stmt
のように、SQL文の操作を準備します.sqlx.NamedStmt
–特定のパラメータに名前を付け、SQL文を生成するアクションをバインドします.次の2つのカーソル・タイプを指定します.
sqlx.Rows
–原生のsql.Rows
に類似し、Queryx
から戻る.sqlx.Row
–sql.Row
からQueryRowx
に戻ります.SQLXライブラリのインストール
go get github.com/jmoiron/sqlx
操作の使用
データベースの接続
//
func initMySQL() (err error) {
dsn := "root:password@tcp(127.0.0.1:3306)/database"
db, err = sqlx.Open("mysql", dsn)
if err != nil {
fmt.Printf("connect server failed, err:%v
", err)
return
}
db.SetMaxOpenConns(200)
db.SetMaxIdleConns(10)
return
}
SetMaxOpenConns
およびSetMaxIdleConns
は、それぞれ最大接続数および最大アイドル数を設定する.データ表現と参照
ここでは、事前にユーザー構造体
user
を宣言し、*sqlx.DB
をグローバル変数として使用します.もちろん、MySQLのドライバパッケージも事前に参照してください.以下のように設計されています.import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
)
var db *sqlx.DB
type user struct {
Id int `db:"id"`
Age int `db:"age"`
Name string `db:"name"`
}
クエリー操作
1行のデータの問合せ
クエリ1行のデータは、
sqlx
ライブラリのGet
関数を使用して実装されます.func (db *DB) Get(dest interface{}, query string, args ...interface{}) error
dest
は、ユーザー宣言変数がクエリー結果を受信し、query
がクエリーSQL文、args
がバインドパラメータに割り当てられます.//
func queryRow() {
sqlStr := "SELECT id, name, age FROM user WHERE id = ?"
var u user
if err := db.Get(&u, sqlStr, 1); err != nil {
fmt.Printf("get data failed, err:%v
", err)
return
}
fmt.Printf("id:%d, name:%s, age:%d
", u.Id, u.Name, u.Age)
}
複数行データの問合せ
複数行のデータをクエリーするには、
Select
関数を使用します.func (db *DB) Select(dest interface{}, query string, args ...interface{}) error
Select
関数を使用してクエリーを行う場合は、マッピングされたデータを受信する構造体配列を宣言する必要があります.//
func queryMultiRow() {
sqlStr := "SELECT id, name, age FROM user WHERE id > ?"
var users []user
if err := db.Select(&users, sqlStr, 0); err != nil {
fmt.Printf("get data failed, err:%v
", err)
return
}
for i := 0; i < len(users); i++ {
fmt.Printf("id:%d, name:%s, age:%d
", users[i].Id, users[i].Name, users[i].Age)
}
}
操作の挿入、更新、削除
sqlx
ライブラリでは、挿入、更新、削除操作は、オリジナルsql
ライブラリ実装と一致し、Exec
関数を使用して実装されます.挿入アクション
//
func insertRow() {
sqlStr := "INSERT INTO user(name, age) VALUES(?, ?)"
result, err := db.Exec(sqlStr, "Meng ", 22)
if err != nil {
fmt.Printf("exec failed, err:%v
", err)
return
}
insertID, err := result.LastInsertId()
if err != nil {
fmt.Printf("get insert id failed, err:%v
", err)
return
}
fmt.Printf("insert data success, id:%d
", insertID)
}
更新アクション
//
func updateRow() {
sqlStr := "UPDATE user SET age = ? WHERE id = ?"
result, err := db.Exec(sqlStr, 22, 6)
if err != nil {
fmt.Printf("exec failed, err:%v
", err)
return
}
affectedRows, err := result.RowsAffected()
if err != nil {
fmt.Printf("get affected failed, err:%v
", err)
return
}
fmt.Printf("update data success, affected rows:%d
", affectedRows)
}
アクションの削除
//
func deleteRow() {
sqlStr := "DELETE FROM user WHERE id = ?"
result, err := db.Exec(sqlStr, 4)
if err != nil {
fmt.Printf("exec failed, err:%v
", err)
return
}
affectedRows, err := result.RowsAffected()
if err != nil {
fmt.Printf("get affected failed, err:%v
", err)
return
}
fmt.Printf("delete data success, affected rows:%d
", affectedRows)
}
パラメータバインド
ライブラリで最も一般的に使用される関数は、クエリー・パラメータの名前付けとバインドを実行する
NamedQuery
と、CUD操作のクエリー・パラメータ名のバインドです.NamedQuery
//
func selectNamedQuery() {
sqlStr := "SELECT id, name, age FROM user WHERE age = :age"
rows, err := db.NamedQuery(sqlStr, map[string]interface{}{
"age": 22,
})
if err != nil {
fmt.Printf("named query failed failed, err:%v
", err)
return
}
defer rows.Close()
for rows.Next() {
var u user
if err := rows.StructScan(&u); err != nil {
fmt.Printf("struct sacn failed, err:%v
", err)
continue
}
fmt.Printf("%#v
", u)
}
}
NamedExec
// named
func insertNamedExec() {
sqlStr := "INSERT INTO user(name, age) VALUES(:name, :age)"
result, err := db.NamedExec(sqlStr, map[string]interface{}{
"name": " ",
"age": 18,
})
if err != nil {
fmt.Printf("named exec failed, err:%v
", err)
return
}
insertId, err := result.LastInsertId()
if err != nil {
fmt.Printf("get last insert id failed, err:%v
", err)
return
}
fmt.Printf("insert data success, id:%d
", insertId)
}
取引アクション
トランザクション操作は、
NamedExec
関数、Begin
関数、およびRollback
関数を使用して行います.//
func (db *DB) Begin() (*Tx, error)
//
func (tx *Tx) Rollback() error
//
func (tx *Tx) Commit() error
サンプルコード:
//
func updateTransaction() (err error) {
tx, err := db.Begin()
if err != nil {
fmt.Printf("transaction begin failed, err:%v
", err)
return err
}
defer func() {
if p := recover(); p != nil {
_ = tx.Rollback()
panic(p)
} else if err != nil {
fmt.Printf("transaction rollback")
_ = tx.Rollback()
} else {
err = tx.Commit()
fmt.Printf("transaction commit")
return
}
}()
sqlStr1 := "UPDATE user SET age = ? WHERE id = ? "
reuslt1, err := tx.Exec(sqlStr1, 18, 1)
if err != nil {
fmt.Printf("sql exec failed, err:%v
", err)
return err
}
rows1, err := reuslt1.RowsAffected()
if err != nil {
fmt.Printf("affected rows is 0")
return
}
sqlStr2 := "UPDATE user SET age = ? WHERE id = ? "
reuslt2, err := tx.Exec(sqlStr2, 19, 5)
if err != nil {
fmt.Printf("sql exec failed, err:%v
", err)
return err
}
rows2, err := reuslt2.RowsAffected()
if err != nil {
fmt.Printf("affected rows is 0
")
return
}
if rows1 > 0 && rows2 > 0 {
fmt.Printf("update data success
")
}
return
}
オープンソースのサポート
最後にこのオープンソースプロジェクトをここに置いて、皆さんが興味があれば、このオープンソースプロジェクトにスターをあげることができます.ありがとうございます.
GitHub jmoiron/sqlx
参考記事