sqlx库基本使用

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlx库基本使用相关的知识,希望对你有一定的参考价值。

原生的数据库操作太过麻烦,sqlx简化了大量操作

安装sqlx

go get github.com/jmoiron/sqlx

连接数据库

package main

import (
	_ "github.com/go-sql-driver/mysql"
	"github.com/jmoiron/sqlx"
)
var(
	db *sqlx.DB
)
func initDB() (err error) 
	dsn := "root:123456@tcp(127.0.0.1:3306)/gos?charset=utf8mb4&parseTime=True"
	db = sqlx.MustConnect("mysql", dsn)  //若出现错误,会panic

	db.SetMaxOpenConns(20)  //设置最大连接数
	db.SetMaxIdleConns(10) //最大闲置连接数
	return

func main()
	initDB()

查询

单条查询

type user struct 
	Id   int
	Name string
	Age  int


// 查询单条数据示例
func queryRowDemo() 
	sqlStr := "select id, name, age from user where id=?"
	var u user
	err := db.Get(&u, sqlStr, 1)
	if err != nil 
		fmt.Printf("get failed, err:%v\\n", err)
		return
	
	fmt.Printf("id:%d name:%s age:%d\\n", u.Id, u.Name, u.Age)

多行查询

使用DB.Select直接返回对象数组

// 查询单条数据示例
func queryRowDemo() 
	sqlStr := "select id, name, age from user where id!=?"
	var users []user
	err := db.Select(&users, sqlStr, -1)
	if err != nil 
		fmt.Printf("get failed, err:%v\\n", err)
		return
	
	fmt.Printf("%#v\\n", users)

增删改

都是调用ret,err := DB.exec(sql,...arg)进行操作

其中返回的ret有一些关于此次操作的属性,比如影响行数(ret.RowsAffected())之类的

// 插入数据
func insertRowDemo() 
	sqlStr := "insert into user(name, age) values (?,?)"
	ret, err := db.Exec(sqlStr, "沙河小王子", 19)
	if err != nil 
		fmt.Printf("insert failed, err:%v\\n", err)
		return
	
	theID, err := ret.LastInsertId() // 新插入数据的id
	if err != nil 
		fmt.Printf("get lastinsert ID failed, err:%v\\n", err)
		return
	
	fmt.Printf("insert success, the id is %d.\\n", theID)


// 更新数据
func updateRowDemo() 
	sqlStr := "update user set age=? where id = ?"
	ret, err := db.Exec(sqlStr, 39, 6)
	if err != nil 
		fmt.Printf("update failed, err:%v\\n", err)
		return
	
	n, err := ret.RowsAffected() // 操作影响的行数
	if err != nil 
		fmt.Printf("get RowsAffected failed, err:%v\\n", err)
		return
	
	fmt.Printf("update success, affected rows:%d\\n", n)


// 删除数据
func deleteRowDemo() 
	sqlStr := "delete from user where id = ?"
	ret, err := db.Exec(sqlStr, 6)
	if err != nil 
		fmt.Printf("delete failed, err:%v\\n", err)
		return
	
	n, err := ret.RowsAffected() // 操作影响的行数
	if err != nil 
		fmt.Printf("get RowsAffected failed, err:%v\\n", err)
		return
	
	fmt.Printf("delete success, affected rows:%d\\n", n)

NamedExec

上面的DB.exec(sql,...arg)传递参数必须要和sql语句中的占位符?一一对应

使用NamedExec可以把参数整合为一个mapstruct传递

func insertUserDemo()(err error)
	sqlStr := "INSERT INTO user (name,age) VALUES (:name,:age)" //此处占位符变成:字段的形式(填写的字段和struct中的字段名相对应)
	var u user
	u = user Name:"上跟绫香",Age: 17
//	u = map[string]interface  //改成map的形式也是一样的
//			"name": "上根绫香",
//			"age": 18,
//		
	_, err = db.NamedExec(sqlStr,u)
	return

NamedQuery

NamedExec类似,返回一个可使用Next()迭代的对象

func namedQuery()
	sqlStr := "SELECT * FROM user WHERE name=:name"
	// 使用map做命名查询
	rows, err := db.NamedQuery(sqlStr, map[string]interface"name": "小由纪同学")
	if err != nil 
		fmt.Printf("db.NamedQuery failed, err:%v\\n", err)
		return
	
	defer rows.Close()

	for rows.Next()
		var u user
		err := rows.StructScan(&u)
		if err != nil 
			fmt.Printf("scan failed, err:%v\\n", err)
			continue
		
		fmt.Printf("user:%#v\\n", u)
	

	u := user
		Name: "cl",
	
	// 使用结构体命名查询,根据结构体字段的 db tag进行映射
	rows, err = db.NamedQuery(sqlStr, u)
	if err != nil 
		fmt.Printf("db.NamedQuery failed, err:%v\\n", err)
		return
	
	defer rows.Close()
	for rows.Next()
		var u user
		err := rows.StructScan(&u)
		if err != nil 
			fmt.Printf("scan failed, err:%v\\n", err)
			continue
		
		fmt.Printf("user:%#v\\n", u)
	

以上是关于sqlx库基本使用的主要内容,如果未能解决你的问题,请参考以下文章

sqlx库基本使用

GoLang sqlx库使用

Go sqlx库

Go_sqlx和占位符

Go语言增强版操作Mysql(Sqlx)

sqlx使用说明