Go言語sqlxフレームワークインスタンスsqlxの使用方法

7976 ワード

sqlxを使ったdao操作は、オリジナルのsqlよりも便利です
main.go
package main

import (
    _ "github.com/lib/pq"
    "github.com/jmoiron/sqlx"
    "fmt"
    "time"
    "runtime"
)

//     
type User struct {
    Id      int       `db:"id"`
    Name    string    `db:"name"`
    Created time.Time `db:"created"`
    ClassId int       `db:"class_id"`
}

//Class   
type Class struct {
    Id   int    `db:"id"`
    Name string `db:"name"`
}

func main() {

    //1.      
    db, err := sqlx.Open("postgres", "postgres://postgres:123@localhost:5432/test?sslmode=disable")
    SimplePanic(err)
    fmt.Println(db)
    defer db.Close()

    //2.  crud     
    //2.1   ,  ,  
    if false {
        var crud int = 1 //   123
        switch crud {
        case 1:
            _, err = db.Exec("insert into public.user(name) values($1)", "ft")
            SimplePanic(err)
        case 2:
            _, err = db.Exec("update public.user set name ='ftx' where name=$1", "ft")
            SimplePanic(err)

        case 3:
            _, err = db.Exec("delete from public.user where name=$1", "ftx")
            SimplePanic(err)

        }
    }
    //2.2   
    if true {
        user := User{}
        users := make([]User, 0)
        //    Get
        if false {
            err = db.Get(&user, "select * from public.user where id=$1", 1016)
            SimplePanic(err)
            fmt.Println(user)
        }

        //    Select
        if false {
            err = db.Select(&users, "select * from public.user where id>$1", 900)
            SimplePanic(err)
        }
        //2.3  Queryx QueryRowx   
        if true {
            //Queryx()
            if false {
                var rows *sqlx.Rows
                rows, err = db.Queryx("select * from public.user where id>$1", 1011)
                SimplePanic(err)
                for rows.Next() {

                    err = rows.Scan(&user.Id, &user.Name, &user.Created, &user.ClassId)
                    SimplePanic(err)
                    users = append(users, user)
                }
                SimplePanic(rows.Err())
                fmt.Println(len(users))
            }

            //QueryRowx()
            if false {
                var row *sqlx.Row
                var user = User{}
                row = db.QueryRowx("select * from public.user where id =$1", 1016)
                err = row.Scan(&user.Id, &user.Name, &user.Created, &user.ClassId)
                SimplePanic(row.Err())
                fmt.Println(user)
            }
        }

    }

    //3.   
    if false {
        var tx *sqlx.Tx
        tx, err = db.Beginx()
        SimplePanic(err)

        _, err = tx.Exec("insert into public.user(name) values($1)", "ft3")
        if err != nil {
            tx.Rollback()
            SimplePanic(err)
        }
        _, err = tx.Exec("insert into public.user(name) values($1)", "ft4")
        if err != nil {
            tx.Rollback()
            SimplePanic(err)
        }
        err = tx.Commit()
        SimplePanic(err)
    }

    //4.  ,      sql    
    if false {
        userResult := User{}
        userQuery := User{}
        userQuery.Name = "ft"
        var rows *sqlx.Rows
        fmt.Println(userQuery.Name)
        rows, err = db.Queryx("SELECT * FROM public.user WHERE name=$1", userQuery.Name)
        for rows.Next() {
            err = rows.Scan(&userResult.Id, &userResult.Name, &userResult.Created, &userResult.ClassId)
            SimplePanic(err)
        }
        SimplePanic(err)
    }

}

func SimplePanic(err error) {
    if err != nil {
        _, file, line, _ := runtime.Caller(1)
        fmt.Println(file, line, err)
        runtime.Goexit()
    }

}


sqlxとxormは軽量レベルより多く、機能上の制限も大きくなっています.例えば、トランザクションの処理では、sqlxは独立したトランザクション間の処理しかサポートされていません.xormはネストされたトランザクションレベルをサポートしても制御できません.xormは8つのレベルを設定できます.
Mybatisのようにsql文を単独で構成したい場合は、xormを使用することをお勧めします.直接SqlMapで行うことができます.sqlxは自分でsql構成を書いて自分で解析を書く必要があります.そして、サーバに対する圧力が大きい場合は、xormには読み書き分離のマルチコネクション負荷バランスのとれたコンボがあります
しかし、一般的なビジネスは両方適用できます.xormはxormの使用例を参照します.
.