sqlx是一款go语言的数据库操作库,它是对go语言自带的database/sql的扩展,提供了更多的功能,使用起来更加方便。 它能极大的方便我们对数据库的操作,提高开发效率,同时又没有GORM那么臃肿,学习成本也不高。对于我这种原生sql派来说,再好不过了。
github地址: github.com/jmoiron/sql...
准备操作
首先,我们新建一张用户表,表结构如下:
sql
CREATE TABLE `user` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '姓名',
`mobile` char(11) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '手机号',
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modified_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `udx_mobile` (`mobile`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
初始化项目
首先,我们新建一个目录sqlxdemo,进入目录,进行初始化:
shell
go mod init sqlxdemo
这里如果使用Goland新建项目,会自动初始化,不需要手动执行。
新建db.go,初始化连接
go
package sqlxdemo
import (
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
_ "github.com/jmoiron/sqlx"
"log"
"time"
)
var conn *sqlx.DB
func init() {
var err error
// 初始化db连接
conn, err = sqlx.Connect("mysql", "用户名:密码@tcp(localhost:3306)/rclx?charset=utf8mb4&parseTime=True&loc=Local")
if err != nil {
log.Fatalf("Connect to database failed: %v", err)
return
}
// 设置最大连接数
conn.SetMaxOpenConns(100)
// 设置最大空闲连接数
conn.SetMaxIdleConns(20)
// 设置每个连接的过期时间
conn.SetConnMaxLifetime(time.Second * 60)
if err = conn.Ping(); err != nil {
log.Fatalf("Ping to database failed: %v", err)
return
}
log.Println("Connect to database success")
}
新建user.go,定义user结构体及相关操作。
go
package sqlxdemo
import (
"github.com/jmoiron/sqlx"
"time"
)
type User struct {
Id int64 `db:"id"`
Name string `db:"name"`
Mobile string `db:"mobile"`
CreatedAt time.Time `db:"created_at"`
ModifiedAt time.Time `db:"modified_at"`
}
// CreateUser 创建用户
func CreateUser(db *sqlx.DB, user *User) (int64, error) {
sql := `INSERT INTO user(name, mobile) VALUES (?, ?)`
result, err := db.Exec(sql, user.Name, user.Mobile)
if err != nil {
return 0, err
}
return result.LastInsertId()
}
// GetUserById 根据id获取用户
func GetUserById(db *sqlx.DB, id int64) (*User, error) {
sql := `SELECT * FROM user WHERE id = ?`
user := new(User)
err := db.Get(user, sql, id)
if err != nil {
return nil, err
}
return user, nil
}
编写测试代码
编写测试文件user_test.go:
go
package sqlxdemo
import (
"github.com/stretchr/testify/assert"
"testing"
)
func TestCreateUser(t *testing.T) {
user := &User{
Name: "test1",
Mobile: "13800138001",
}
id, err := CreateUser(conn, user)
assert.Equal(t, err, nil)
assert.NotEqual(t, id, 0)
user, err = GetUserById(conn, id)
assert.Equal(t, err, nil)
assert.Equal(t, user.Name, "test1")
assert.Equal(t, user.Mobile, "13800138001")
}
此处,我们引入如testify包以方便测试。引入新包之后,在goland里,可以直接用快捷键来同步包,也可以在终端下执行:
shell
go mod tidy
运行测试,测试结果:
注:此文原载于本人个人网站,链接地址。
本文由mdnice多平台发布