sqlx使用入门

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多平台发布

相关推荐
dazhong20123 分钟前
PLSQL 客户端连接 Oracle 数据库配置
数据库·oracle
了一li2 小时前
Qt中的QProcess与Boost.Interprocess:实现多进程编程
服务器·数据库·qt
码农君莫笑3 小时前
信管通低代码信息管理系统应用平台
linux·数据库·windows·低代码·c#·.net·visual studio
别致的影分身3 小时前
使用C语言连接MySQL
数据库·mysql
京东零售技术5 小时前
“慢”增长时代的企业数据体系建设:超越数据中台
数据库
sdaxue.com5 小时前
帝国CMS:如何去掉帝国CMS登录界面的认证码登录
数据库·github·网站·帝国cms·认证码
o(╥﹏╥)6 小时前
linux(ubuntu )卡死怎么强制重启
linux·数据库·ubuntu·系统安全
阿里嘎多学长6 小时前
docker怎么部署高斯数据库
运维·数据库·docker·容器
Yuan_o_6 小时前
Linux 基本使用和程序部署
java·linux·运维·服务器·数据库·后端
Sunyanhui16 小时前
牛客网 SQL36查找后排序
数据库·sql·mysql