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

相关推荐
小白学大数据16 分钟前
JavaScript重定向对网络爬虫的影响及处理
开发语言·javascript·数据库·爬虫
time never ceases37 分钟前
使用docker方式进行Oracle数据库的物理迁移(helowin/oracle_11g)
数据库·docker·oracle
Frank牛蛙40 分钟前
1.每日SQL----2024/11/7
数据库·sql
Ciderw42 分钟前
块存储、文件存储和对象存储详细介绍
网络·数据库·nvme·对象存储·存储·块存储·文件存储
薛晓刚43 分钟前
数据库优化指南:如何将基本功能运用到极致?
数据库
stars_User1 小时前
MySQL数据库面试题(下)
数据库·mysql
未来之窗软件服务1 小时前
sql速度优化多条合并为一条语句
数据库
山东布谷科技官方1 小时前
布谷直播源码部署服务器关于数据库配置的详细说明
运维·服务器·数据库·直播系统源码·直播源码·直播系统搭建·直播软件开发
易云码2 小时前
信息安全建设方案,网络安全等保测评方案,等保技术解决方案,等保总体实施方案(Word原件)
数据库·物联网·安全·web安全·低代码
newxtc2 小时前
【客观理性深入讨论国产中间件及数据库-科创基础软件】
数据库·中间件·国产数据库·国产中间件·科创