Categorygithub.com/kmlixh/gom/v3
package
3.0.5
Repository: https://github.com/kmlixh/gom.git
Documentation: pkg.go.dev

# Packages

No description provided by the author
No description provided by the author

# README

gom

gom - An Easy ORM library for Golang

golang Go Report Card GitHub GoDoc

基本介绍&特性

gom是一个基于golang语言的关系型数据库ORM框架(CRUD工具库,支持事务)

目前最新版本为v3.0.0,于2024年1月6日发布。详见下方的迭代注记

当前支持的数据库类型为 mysql及其衍生品 mariadbPostgres*

数据库类型支持自定义扩展(参考factory/mysql/mysql.go)

gom是goroutine安全的(自认为的安全)

快速入门

使用go mod的情况下:


require github.com/kmlixh/gom/v2 v3.0.0

或者

go get github.com/kmlixh/gom/[email protected]

一个简单的CRUD示例

package main

import (
	"github.com/google/uuid"
	"github.com/kmlixh/gom/v2"
	_ "github.com/kmlixh/gom/v2/factory/mysql"
	"time"
)

var dsn = "remote:remote123@tcp(10.0.1.5)/test?charset=utf8&loc=Asia%2FShanghai&parseTime=true"

type User struct {
	Id       int64     `json:"id" gom:"id"`
	Pwd      string    `json:"pwd" gom:"pwd"`
	Email    string    `json:"email" gom:"email"`
	Valid    int       `json:"valid" gom:"-"`
	NickName string    `json:"nicks" gom:"nick_name"`
	RegDate  time.Time `json:"reg_date" gom:"reg_date"`
}

var db *gom.DB

func init() {
	//Create DB ,Global
	var er error
	db, er = gom.Open("mysql", dsn, true)
	if er != nil {
		panic(er)
	}
}

func main() {
	var users []User
	//Query
	db.Where(gom.Cnd("name", gom.Eq, "kmlixh")).Page(0, 100).Select(&users)
	//Update
	temp := users[0]
	temp.NickName = uuid.New().String()
	temp.RegDate = time.Now()
	db.Update(temp)
	//Delete
	db.Delete(users[1])
	tt := User{
		Pwd:      "123213",
		Email:    "[email protected]",
		Valid:    1,
		NickName: uuid.New().String(),
		RegDate:  time.Now(),
	}
	db.Insert(tt)

}


用于接收实体的对象,可以增加gom标记(TAG)来实现数据库字段到实体字段的特殊映射。正常情况下,其实什么都不需要做。

type User struct {
Id       int64     `json:"id" gom:"id"`
Pwd      string    `json:"pwd" gom:"pwd"`
Email    string    `json:"email" gom:"email"`
Valid    int       `json:"valid" gom:"-"`
NickName string    `json:"nicks" gom:"nick_name"`
RegDate  time.Time `json:"reg_date" gom:"reg_date"`
}


短划线“-”标记此字段在数据库中不映射。除非特别使用gom标记指定了数据库映射关系,gom会自动将数据库字段按照驼峰转蛇形的方式转换,例如:CamelName会被转换为camel_name.而正常情况下,这些操作都是不必要的,甚至你什么都不用做

DB结构体具有的方法(函数)如下:

RawDb() 获取原生的sql.Db对象
Table(tableName string) 设置表名
Raw() *sql.Db 获取go底层的db对象
OrderBy()排序
CleanOrders清除排序
OrderByAsc
OrderByDesc
Where2
Where
Clone
Page
Count
Sum
Select
SelectByModel
First
Insert
Delete
Update
ExecuteRaw
ExecuteStatement
Begin
IsInTransaction
Commit
Rollback
DoTransaction
CleanDb

迭代注记

2024年1月6日 v3.0版本发布

1.增加了对Postgres数据库的兼容。
底层使用的是github.com/jackc/pgx/v5,所以配置数据的dsn和此库一致
例如标准的jdbc连接串:postgres://username:password@localhost:5432/database_name
或者是DSN:"user=postgres password=secret host=localhost port=5432 database=pgx_test sslmode=disable"

2.重构了底层逻辑,简化了业务流程。
去除了大量无关的代码逻辑。简化了对tag的使用。

2023年12月30日 修复查询迭代是sql必须存在于一行的bug

例如 使用db.Where()...之后,如果换行调用db.Select之类的CRUD语句,前面的状态会丢失。主要 是由于没有遵守Golang的参数传递的原则导致的。

2022年9月3日 修复In只有一个参数是sql异常的mysql报错;版本更新为v2.1.1

2022年9月2日 修复MapToCondition 没有处理简单类型数组的bug;版本更新为2.1.0

2022年9月1日 修复某些情况下,In条件解析数组参数异常的bug;版本更新为2.10

2022年7月21日 修复复杂条件解析逻辑混乱的bug;版本更新为2.0.9(你猜的没错,2.0.8也是修复这个bug,没修好)

2022年7月20日 修复Count和Sum时条件无效的bug,版本更新为v2.0.7(中间两个版本改了什么忘记了,懒得去🍵git)

2022年4月17日 修复bug,更新版本为v2.0.4

修复查询条件关系错误的bug;
修复查询条件初始化为空时附加属性不合理的bug;
新增CndEmpty()方法,用于创建空的Condition对象,此方法与CndRaw("")等价

2022年4月15日 01:56:50 v2.0.0发布

v2.0
代码几乎全部重构,你大概可以认为这是一个全新的东西,API全变了(不过也没事,之前的版本也就我一个人在用^_^自嗨锅)
代码测试覆盖率93.0%(相关的测试覆盖率结果可以看test_cover.html以及cover.out)

2019年6月19日 17:44:18

v1.1.2
修复CreateSingleTable的一些bug

2019年6月15日 08:18:25

v1.1.1
修复一些bug;
增加NotIn模式

2019年5月15日 09:18:06

v1.0.8
截止1.0.8又修复了若干bug,详细请看commit

2019年4月30日 11:15:38

1.修复了大量的bug;(具体可以看提交记录)
2.改造了数据获取的方式,从原来的固定格式转换,变成了接近于数据库底层的Scanner模式的性能
3.优化了自定义类型的查询和存储

2017年6月22日 12:54:36

1.修复若干bug(具体修复哪些bug记不清了 ^_^)
2.修复Update,Insert,Delete方法传入不定参数时的bug(无法解析,或者解析不正确,使用递归解决)
3.修复Condition为空的情况下会莫名注入一个“where”进入sql语句的bug 
4.Db对象增加了一个Count函数,故名思议,用来做count的

2017年6月18日22:47:53

1.修复无法使用事务的bug
2.修改了数据库操作的一些基础逻辑,每次操作前都会进行Prepare操作,以提高一些“性能”
3.为了修复上面的bug,修改了整体的gom.Db结构