Go言語操作MySQLのSQLXパッケージ


友情のヒント:この文章は约14分5秒読む必要があります.足りないところはよろしくお愿いします.読んでくれてありがとう.当駅を購読する
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.Rowsql.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
    参考記事
  • https://github.com/jmoiron/sqlx
  • http://jmoiron.github.io/sqlx/
  • sqlxライブラリ使用ガイド–李文周のブログ