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