Go语言 sqlx框架使用实例 sqlx如何使用

使用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使用实例

.

你可能感兴趣的:(go,sqlx)