4000字详解go语言操作mysql神器sqlx库(一篇文章就会了)

对于很多Java转go,或者刚开始学go的同学来说,会感觉gorm包括database/sql都用不顺手,奇怪的语法以及难理解的返回值,sqlx足以解决一切烦恼(本文默认读者会基础的sql语句)

1 安装sqlx库

传统安装方式,直接get就好了

go get github.com/jmoiron/sqlx

但要注意一定要安装数据库驱动依赖

go get github.com/go-sql-driver/mysql 

2 引入依赖

直接导入github.com/jmoiron/sqlx就好

3 连接MySQL

user:password@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True
user:你的用户名
password: 你的密码
127.0.0.1:3306:你的IP以及端口
charset:你的编码方式(一般情况都会用utf8mb4)
parseTime:在MySQL数据库连接字符串中,parseTime=True 参数用于告诉MySQL驱动程序将从数据库中检索的时间类型数据解析为Go的时间类型(time.Time),而不是默认的字符串类型。这样可以方便地在应用程序中使用时间数据而不需要手动转换类型。一般都是True。

package main

import (
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"github.com/jmoiron/sqlx"
)


var db *sqlx.DB//获取数据库对象

func main() {

	mDb, err := sqlx.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True")//连接操作,mDb是返回的数据库实例
	if err != nil {
		fmt.Println("连接数据库异常:", err)
		return
	}
	db = mDb


4 插入数据

直接来看代码吧

package main

import (
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"github.com/jmoiron/sqlx"
)

var db *sqlx.DB

func main() {

	mDb, err := sqlx.Open("mysql", "root:root@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True")
	if err != nil {
		fmt.Println("连接数据库异常:", err)
		return
	}
	db = mDb
	r, err1 := db.Exec("insert into user(mobile, password, sex, user_name)values(?, ?, ?, ?)", "c", "123456", 0, "c")//这里面?的作用就是大家理解的那样,传数据的
	if err1 != nil {
		fmt.Println("数据插入异常, ", err1)
		return
	}
}

5 查询数据

注意的是我们一定要搞一个结构体来接受查询结果,结构体类型和数据库表结构一致

package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"github.com/jmoiron/sqlx"
)

type User struct {
	Id       int64          `db:"id"`//这里面db的意思就是在数据库中对应的字段,和gin的required类似
	Name     string         `db:"user_name"`//数据库中一般不大写,但结构体中一般要大写用于被其他包所接受
	Sex      int            `db:"sex"`
	Mobile   string         `db:"mobile"`
}

var db *sqlx.DB

func main() {

	//数据库连接部分,不再重复写
	db = mysqlDb
	var user []User
	err1 := db.Select(&user, "select id, user_name, sex, mobile, password from user where id=?", 1690290594064429065)//很经典的sql语句
	if err1 != nil {
		fmt.Println("查询异常, ", err1)
		return
	}
}


6 更新和删除数据

直接看代码

package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"github.com/jmoiron/sqlx"
)

type User struct {
	Id       int64          `db:"id"`
	Name     string         `db:"user_name"`
	Sex      int            `db:"sex"`
	Mobile   string         `db:"mobile"`
	Password sql.NullString `db:"password"`
}

var db *sqlx.DB

func main() {

	mysqlDb, err := sqlx.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True")
	if err != nil {
		fmt.Println("连接数据库异常:", err)
		return
	}
	db = mysqlDb
	res, err := db.Exec("update user set user_name=? where id=?", "hello11", 1690290594064429065)
	if err != nil {
		fmt.Println("更新失败:", err)
		return
	}
	res, err := db.Exec("delete from user where id=?", 1690290594064429065)
	if err != nil {
		fmt.Println("删除失败, ", err)
		return
	}
}


简单的说就是添加删除更新用Exec,查询用Select。

7 join操作

不再介绍其他操作,简单介绍join,其他类似

import (
    "github.com/jmoiron/sqlx"
)

func main() {
    db, err := sqlx.Connect("mysql", "root:password@tcp(localhost:3306)/database")
    if err != nil {
        panic(err)
    }
    
    type User struct {
        ID   int    `db:"id"`
        Name string `db:"name"`
        Age  int    `db:"age"`
    }

    type Post struct {
        ID     int    `db:"id"`
        UserID int    `db:"user_id"`
        Title  string `db:"title"`
    }

    var result []struct {
        User
        Post
    }

    query := `SELECT users.id, users.name, users.age, posts.id, posts.user_id, posts.title
              FROM users
              JOIN posts ON users.id = posts.user_id`

    err = db.Select(&result, query)
    if err != nil {
        panic(err)
    }

    // Access the joined data in the result slice
    for _, res := range result {
        fmt.Printf("User ID: %d, Name: %s, Age: %d\n", res.User.ID, res.User.Name, res.User.Age)
        fmt.Printf("Post ID: %d, Title: %s\n", res.Post.ID, res.Post.Title)
    }
}

8 其他常用函数

Get: 从数据库中检索单个行并将其映射到结构体。
NamedExec: 执行带有命名参数的SQL语句。
NamedQuery: 执行带有命名参数的查询语句并将结果映射到结构体切片。
Queryx: 执行查询并返回一个迭代器,可以逐行处理结果。
NamedQuery: 执行带有命名参数的查询语句并将结果映射到结构体切片。

本文介绍了sqlx库的基本使用,个人认为要比Gorm和database/sql在mysql的操作上好用很多

后续还会更新go的redis等常用组件的使用,以及这些组件的原理,目前该系列文章已经有了:
万字详解Kafka并附带go如何操作Kafka https://blog.csdn.net/m0_73629745/article/details/139832116?spm=1001.2014.3001.5501

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值