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

相关推荐
AAA修煤气灶刘哥7 小时前
后端人速藏!数据库PD建模避坑指南
数据库·后端·mysql
RestCloud11 小时前
揭秘 CDC 技术:让数据库同步快人一步
数据库·api
得物技术14 小时前
MySQL单表为何别超2000万行?揭秘B+树与16KB页的生死博弈|得物技术
数据库·后端·mysql
可涵不会debug18 小时前
【IoTDB】时序数据库选型指南:工业大数据场景下的技术突围
数据库·时序数据库
ByteBlossom18 小时前
MySQL 面试场景题之如何处理 BLOB 和CLOB 数据类型?
数据库·mysql·面试
麦兜*18 小时前
MongoDB Atlas 云数据库实战:从零搭建全球多节点集群
java·数据库·spring boot·mongodb·spring·spring cloud
Slaughter信仰18 小时前
深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第十章知识点问答(10题)
java·jvm·数据库
麦兜*19 小时前
MongoDB 在物联网(IoT)中的应用:海量时序数据处理方案
java·数据库·spring boot·物联网·mongodb·spring
-Xie-19 小时前
Mysql杂志(十六)——缓存池
数据库·mysql·缓存