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

相关推荐
vvvae12345 小时前
分布式数据库
数据库
雪域迷影6 小时前
PostgreSQL Docker Error – 5432: 地址已被占用
数据库·docker·postgresql
bug菌¹7 小时前
滚雪球学Oracle[4.2讲]:PL/SQL基础语法
数据库·oracle
逸巽散人7 小时前
SQL基础教程
数据库·sql·oracle
月空MoonSky7 小时前
Oracle中TRUNC()函数详解
数据库·sql·oracle
momo小菜pa7 小时前
【MySQL 06】表的增删查改
数据库·mysql
向上的车轮8 小时前
Django学习笔记二:数据库操作详解
数据库·django
编程老船长8 小时前
第26章 Java操作Mongodb实现数据持久化
数据库·后端·mongodb
全栈师9 小时前
SQL Server中关于个性化需求批量删除表的做法
数据库·oracle
Data 3179 小时前
Hive数仓操作(十七)
大数据·数据库·数据仓库·hive·hadoop