gorms - 辅助 gorm 使用的工具库

122 阅读2分钟

概述

在项目开发中,总是会使用一些 SQL 字符串拼接的方式来达到目的,但这并不优雅且可控

因此创建了一个封装了一些基础操作的 gorms 库,用于辅助 gorm 开发,欢迎大家的 PR 与 star 👏

GitHub Repository - github.com/tzq0301/gor…

本仓库只包含一些简单的字符串处理及其他常用的工具函数(无侵入性),例如(1)封装对模糊查询的 % 通配符的拼接(2)对 AS 别名进行封装(3)分页(4)……

Alias 别名

gorms 提供 AS 与 Alias 两个方法对类似 db.Table("user AS u") 甚至 db.Table(tableName + " u") 这样字符串的拼接操作进行改进

gorms.AS("user", "u")    // "user AS u"
gorms.Alias("user", "u") // "user u"

Connection 数据库连接

gorms 提供了开箱即用的 In-Memory 内存中 SQLite 数据库,可以用其进行单元测试

db, err := gorms.InMemorySqlite()
db, err := gorms.InMemorySqliteWithInitSQL("CREATE TABLE ...")

Like 通配符

在项目开发中,我见过太多的 fmt.Sprintf("%%%v%%", value) 来进行字符串拼接(太不优雅且低效了),因此 gorms 提供一些方法来进行 SQL 字符串拼接的封装方法

gorms.PercentagePrefix("Tim") // "%Tim"
gorms.PercentageSuffix("Tim") // "Tim%"
gorms.PercentageAround("Tim") // "%Tim%"

gorms.Like(gorms.column, pattern)         // db.Where("? LIKE ?", column, %pattern%)
gorms.BeforeLike(gorms.column, pattern)   // db.Where("? LIKE ?", column, %pattern)
gorms.AfterLike(gorms.column, pattern)    // db.Where("? LIKE ?", column, pattern%)

Order 排序

Note - GORM 的 Order 无法防 SQL 注入

  • 提供 Desc 与 Asc 生成显式的排序语句
  • 提供 Orders 方法做排序字段的拼接
gorms.Desc("id") // "id DESC"
gorms.Asc("id")  // "id ASC"
gorms.Orders("id DESC", "create_time ASC") // "id DESC, create_time ASC"

Paginate 分页

提供开箱即用的分页函数,gorms.Paginate 将强制参数矫正为大于等于 1 的值(即确保语义正确,详见源码),不会进行其他默认值的操作,如果你需要对 PageSize 进行约束,可以使用 gorms.PaginateWith 函数

gorms.Paginate(3, 10)         // db.Offset(20).Limit(10)
gorms.PageParamConvert(2, 10) // offset=10 & limit=10

// pageSizeBoundFn is used for the constraints of pageSize
// check paginate_test.go for usage in detail 
gorms.PaginateWith(pageNum, pageSize, pageSizeBoundFn)
gorms.PageParamConvertWith(pageNum, pageSize, pageSizeBoundFn)

String 字符串

gorms.SignedIntegerToString(123) // "123"