对于很多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