sqlx使用入门

sqlx是一款go语言的数据库操作库,它是对go语言自带的database/sql的扩展,提供了更多的功能,使用起来更加方便。 它能极大的方便我们对数据库的操作,提高开发效率,同时又没有GORM那么臃肿,学习成本也不高。对于我这种原生sql派来说,再好不过了。

github地址: https://github.com/jmoiron/sqlx

准备操作

首先,我们新建一张用户表,表结构如下:

CREATE TABLE `user` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20COLLATE utf8mb4_general_ci NOT NULL COMMENT '姓名',
  `mobile` char(11COLLATE 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,进入目录,进行初始化:

go mod init sqlxdemo

这里如果使用Goland新建项目,会自动初始化,不需要手动执行。

新建db.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结构体及相关操作。

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:

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里,可以直接用快捷键来同步包,也可以在终端下执行:

go mod tidy

运行测试,测试结果: 测试结果

注:此文原载于本人个人网站,链接地址

本文由 mdnice 多平台发布

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值