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

相关推荐
白远山23 分钟前
健身场馆无人自动化解决方案:从架构到落地实践
java·开发语言·数据库·数据挖掘·需求分析
虎虎(_ _)。゜zzZ28 分钟前
SQLAlchemy入门教程
数据库·后端·python·sql·ai·sqlalchemy
Data_Journal1 小时前
如何将网页抓取用于机器学习
大数据·开发语言·数据库·python·scrapy
Lyra_Infra2 小时前
从 MySQL 到达梦:一次信创隔离环境里的数据库迁移踩坑实录
数据库·后端·mysql
数据工匠老o2 小时前
sysbench/TPC-C/自定义脚本:数据库压测工具对比与实战流程
数据库·测试
数安3000天2 小时前
数据分类分级产品有哪四类技术路线?
大数据·数据库
泡茶喝茶写代码2 小时前
量化数据开发实战系列(第 25 篇):基金基础接口实战:基金列表、ETF-LOF 分类、基金概况、净值数据
java·数据库·人工智能·python·mysql
张小姐的猫2 小时前
【AI大模型接入SDK】 —— 数据管理 & 与Session模块进行联动
数据结构·数据库·c++·人工智能·python·chatgpt
IvorySQL3 小时前
PostgreSQL 日报|大模型破解在线校验和(9 月 15 日)
数据库·人工智能·postgresql
Leon-Ning Liu4 小时前
Oracle 19c ASMB 进程 PGA 内存泄漏排查实战 (Bug 38610635)
数据库·oracle