orm

package module
v1.0.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 8, 2021 License: MIT Imports: 18 Imported by: 1

README

1、封装数据库的操作,有orm的影子,但是又不是强orm,sql的查询鼓励单表操作,这个工具能够满足日常的表操作

通过自动化脚本生成orm
示例代码
package main

import (
	"gitee.com/leicc/go-orm"
	"gitee.com/leicc/go-orm/log"
)

type ConfigSt struct {
	Redis  cache.RedisConfig 
	DbMaster orm.DbConfig	
	DbSlaver orm.DbConfig
}

func main() {
	config = &ConfigSt{
		Redis: cache.RedisConfig{Host:"127.0.0.1:6379", Db:1, Auth:""},
		DbMaster orm.DbConfig{Host:"root:@tcp(127.0.0.1:3306)/xxx?charset=utf8mb4", MaxOpenConns: 128, MaxIdleConns:6}	,
		DbSlaver orm.DbConfig{Host:"root:@tcp(127.0.0.1:3306)/xxx?charset=utf8mb4", MaxOpenConns: 128, MaxIdleConns:6}	,
	}
	orm.LoadDbConfig(config)//配置数据库结构注册到数据库调用配置当中
	orm.CreateOrmModels("dbmaster", "dbslaver", "./models")
}

数据库映射到代码的工具,将每个表生成model,放到指定的目录,提供给项目使用,配置Redis的话将会使用Redis作为缓存策略

2、每个表继承orm.modelSt,也就集成了这个结构体的方法,包含了插入、删除、修改、取列表等等操作,查询的话自动会缓存数据,更新的时候清理缓存数据,通过每个表维护一个版本号更新.

例如生成一个model OsUser结构如下
	type OsUser struct {
		*orm.ModelSt
	}

	func NewOsUser() *OsUser {
		fields := map[string]reflect.Kind{
			"userid":	reflect.Uint64,	//第三方平台用户ID
			"nick":		reflect.String,	//昵称
			...这里省略一万字...
			"stime":	reflect.Uint,	//更新时间
		}
		
		args  := map[string]interface{}{
			"table":		"os_user",
			"orgtable":		"os_user",
			"prikey":		"userid",
			"dbmaster":		"dbmaster",
			"dbslaver":		"dbslaver",
			"slot":			16,			//分表策略,根据userid%16做分表策略
		}

		data := &OsUser{&orm.ModelSt{}}
		data.Init(args, fields)
		return data
	}

	import (
		"crypto/md5"
		"encoding/json"
		"fmt"
		"strings"
		"time"

		"gitee.com/leicc/go-orm"
		"taoba.webim/models"
	)
	func main() {//执行插入记录,如果记录存在则update操作
		userId = 1
		nick = "demo"
		stime, sorm := time.Now().Unix(), models.NewOsUser()
		lastId := sorm.SetModTable(userId).NewOneFromHandler(func(st *orm.QuerySt) *orm.QuerySt {
			st.Value("userid", userId).Value("regtime", stime)
			st.Value("nick", nick).Value("stime", stime)
			return st
		}, func(st *orm.QuerySt) {
			st.Duplicate("nick", nick).Duplicate("stime", stime)
		})
		fmt.Println(lstId)
	}

	user := models.NewOsUser()
	/*
		lastid := user.NewOneFromHandler(func(st *orm.QuerySt) *orm.QuerySt {
			st.Value("nick", "test111").Value("stime", time.Now().Unix())
			st.Value("regtime", time.Now().Unix())
			return st
		}, nil)

		nrow := user.SaveFromHandler(lastid, func(st *orm.QuerySt) *orm.QuerySt {
			st.Value("role", 1).Value("gender", 2)
			return st
		})
	*/
	list2 := user.GetList(0, 4, func(st *orm.QuerySt) string {
		st.Where("userid", []interface{}{1,2,4}, orm.OP_IN)
		return st.GetWheres()
	}, "userid,nick,gender,regtime")
	fmt.Println(list2, "===========")


	list := user.GetNameMap(0, 4, func(st *orm.QuerySt) string {
		st.Where("userid", "1,2,4", orm.OP_IN)
		return st.GetWheres()
	}, "userid,nick,gender,regtime", "userid")
	fmt.Println(list)

	list1 := user.GetList(0, 100, func(st *orm.QuerySt) string {
		st.Where("userid", "1,2", orm.OP_BETWEEN)
		return st.GetWheres()
	}, "userid,nick,gender,regtime", "userid")
	fmt.Println(list1)

	list3 := user.GetColumn(0, 100, func(st *orm.QuerySt) string {
		st.Where("userid", "1,2", orm.OP_BETWEEN)
		return st.GetWheres()
	}, "userid")
	fmt.Println(list3)

	list4 := user.GetAsMap(0, 100, func(st *orm.QuerySt) string {
		st.Where("userid", "1,2", orm.OP_BETWEEN)
		return st.GetWheres()
	}, "userid as `key`,nick as val")
	fmt.Println(list4)
	/*
	nrow2 := user.MultiUpdate(func(st *orm.QuerySt) string {
		st.Where("userid", 4, orm.OP_GT)
		return st.GetWheres()
	}, func(st *orm.QuerySt) *orm.QuerySt {
		st.Value("nick", "哈哈哈")
		return st
	})

	fmt.Println(nrow2)
	*/
	nrow3 := user.MultiDelete(func(st *orm.QuerySt) string {
		st.Where("userid", 4, orm.OP_GT)
		return st.GetWheres()
	})
	fmt.Println(nrow3)

4、分表策略的管理,这里支持三种分表策略取模/整除/日期归档(适合日志类)

sorm := models.NewOsUser()
sorm->SetModTable(id) //根据id取模做分表,slot=16代表总共16张分表0-15  id%16=?代表在第几张分表
这里会自动检查表是否存在,不存在的话创建表,然后做两层缓存结构,内存缓存、文件缓存,如果内存中记录表已经存在则跳过建表的操作
sorm->SetDevTable(id) //根据id除法分表,例如slot=100w 代表1-100在分表 0 101-200分表1 以此类推
sorm->SetYmTable(id) //根据年或者月份做分表归档处理逻辑

5、sqlmap分表主要利用一个开源的包做结构体到map 或者 map到结构体的逆向反转

Documentation

Index

Constants

View Source
const (
	DT_SQL        = "sql"
	DT_AUTO       = "auto"
	OP_AS         = "AS"
	OP_MAX        = "MAX"
	OP_MIN        = "MIN"
	OP_SUM        = "SUM"
	OP_AVG        = "AVG"
	OP_COUNT      = "COUNT"
	OP_EQ         = "="
	OP_NE         = "<>"
	OP_GT         = ">"
	OP_LT         = "<"
	OP_GE         = ">="
	OP_LE         = "<="
	OP_BETWEEN    = "BETWEEN"
	OP_NOTBETWEEN = "NOT BETWEEN"
	OP_LIKE       = "LIKE"
	OP_NOTLIKE    = "NOT LIKE"
	OP_REGEXP     = "REGEXP"
	OP_ISNULL     = "IS NULL"
	OP_ISNOTNULL  = "IS NOT NULL"
	OP_IN         = "IN"
	OP_NOTIN      = "NOT IN"
	OP_AND        = "AND"
	OP_OR         = "OR"
	OP_NOT        = "NOT"
	OP_SQL        = "SQL"
	ASC           = "ASC"
	DESC          = "DESC"
)
View Source
const (
	DBVERCKEY = "dbver"
)

Variables

View Source
var (
	IsShowSql = true
	GdbConfig = make(map[string]*DbConfig)
)
View Source
var GdbCache cache.Cacher = nil
View Source
var GmCache cache.Cacher = nil
View Source
var Gmodelstpl = `` /* 456-byte string literal not displayed */

Functions

func CamelCase

func CamelCase(str string) string

下划线转成驼峰的格式

func CreateOrmModels

func CreateOrmModels(dbmaster, dbslaver, gdir string)

自动创建模型业务 DB隐射到Model

func FileExists

func FileExists(path string) bool

判断文件是否存在

func GetMCache

func GetMCache() cache.Cacher

获取内存存储的缓存策略

func LoadDbConfig

func LoadDbConfig(confPtr interface{})

*

  • 数据库的配置 通过配置导入,配置必须传结构体指针 示例
  • @confPtr *Config 配置对象的指针变量
type Config struct {
	...
	Redis  cache.RedisConfig 	`yaml:"redis"`
	DbMaster  DbConfig 			`yaml:"dbmaster"`
	DbSlaver  DbConfig 			`yaml:"dbslaver"`
}

func NewEngine

func NewEngine(skey string) *sqlx.DB

创建DB对象 提供给其他地方使用

func NewMysql

func NewMysql() *mysqlSt

初始化一个语句结构体对象

func SetDBCache

func SetDBCache(c cache.Cacher)

设置数据库缓存 -默认空不做缓存

func SliceSqlMap2Struct

func SliceSqlMap2Struct(ptrSt interface{}, data []SqlMap) error

提供SqlMap转义成struct结构类型 只支持常用类型的

func SnakeCase

func SnakeCase(str string) string

将驼峰的命名格式反转过来

func SqlMap2Struct

func SqlMap2Struct(ptrSt interface{}, data SqlMap) error

提供SqlMap转义成struct结构类型 只支持常用类型的

func SqlMapDeleteItems

func SqlMapDeleteItems(a SqlMap, keys ...string)

删除执行的key信息

Types

type DHandler

type DHandler func(st *QuerySt)

type DbConfig

type DbConfig struct {
	Driver       string `yaml:"driver"`
	Host         string `yaml:"host"`
	MaxOpenConns int    `yaml:"maxOpenConns"`
	MaxIdleConns int    `yaml:"maxIdleConns"`
}

*****************************************************************************

	     数据库的适配器,主要调整数据库与配置类 Redis与配置类的衔接,初始化数据库缓存
 *****************************************************************************

type ModelSt

type ModelSt struct {
	// contains filtered or unexported fields
}

定义数据模型的基础结构

func (*ModelSt) CacheKey

func (self *ModelSt) CacheKey(ckey string) string

缓存策略的key信息

func (*ModelSt) Delete

func (self *ModelSt) Delete(id interface{}) int64

删除一条记录信息

func (*ModelSt) EqMod

func (self *ModelSt) EqMod(idx, oidx int64) bool

func (*ModelSt) GetAsMap

func (self *ModelSt) GetAsMap(offset, limit int64, cHandler WHandler, fields string) SqlMap

只获取数据信息列表key,val

func (*ModelSt) GetAsSQL

func (self *ModelSt) GetAsSQL(sql string, isFirst bool, offset, limit int64) interface{}

通过SQL查询数据

func (*ModelSt) GetCacheVer

func (self *ModelSt) GetCacheVer() int64

获取db存储的版本号

func (*ModelSt) GetColumn

func (self *ModelSt) GetColumn(offset, limit int64, cHandler WHandler, fields string, args ...string) []string

只获取数据信息列表

func (*ModelSt) GetHash

func (self *ModelSt) GetHash(args ...interface{}) string

查询条件hash成md5字符串

func (*ModelSt) GetItem

func (self *ModelSt) GetItem(cHandler WHandler, fields string, args ...string) SqlMap

获取一个选项记录信息

func (*ModelSt) GetList

func (self *ModelSt) GetList(offset, limit int64, cHandler WHandler, fields string, args ...string) []SqlMap

只获取数据信息列表

func (*ModelSt) GetNameMap

func (self *ModelSt) GetNameMap(offset, limit int64, cHandler WHandler, fields string, key string) map[string]SqlMap

获取命名map,key必须属于fields当中的字段

func (*ModelSt) GetOne

func (self *ModelSt) GetOne(id interface{}) SqlMap

获取一个对象实例

func (*ModelSt) GetSlot

func (self *ModelSt) GetSlot() int

func (*ModelSt) GetTable

func (self *ModelSt) GetTable() string

func (*ModelSt) GetTotal

func (self *ModelSt) GetTotal(cHandler WHandler, fields string) string

获取一个选项记录信息

func (*ModelSt) IdClearCache

func (self *ModelSt) IdClearCache(id interface{}) *ModelSt

根据ID删除缓存策略

func (*ModelSt) Init

func (self *ModelSt) Init(data map[string]interface{}, fields map[string]reflect.Kind)

初始化模型 业务参数设定

func (*ModelSt) MultiDelete

func (self *ModelSt) MultiDelete(whandler WHandler) int64

删除多条记录 单数缓存数据可能还是存在 通过id获取数据的情况

func (*ModelSt) MultiUpdate

func (self *ModelSt) MultiUpdate(whandler WHandler, vhandler VHandler) int64

通过执行匿名函数实现数据更新关系绑定

func (*ModelSt) NewOne

func (self *ModelSt) NewOne(fields map[string]interface{}, dupfields map[string]interface{}) int64

表中新增一条记录 主键冲突且设置dup的话会执行后续配置的更新操作

func (*ModelSt) NewOneFromHandler

func (self *ModelSt) NewOneFromHandler(vhandler VHandler, dhandler DHandler) int64

通过执行匿名函数实现数据更新关系绑定

func (*ModelSt) Query

func (self *ModelSt) Query() *QuerySt

获取db查询的Query db要自行关闭哟

func (*ModelSt) ResetTable

func (self *ModelSt) ResetTable() *ModelSt

func (*ModelSt) Save

func (self *ModelSt) Save(id interface{}, fields map[string]interface{}) int64

更新信息记录

func (*ModelSt) SaveFromHandler

func (self *ModelSt) SaveFromHandler(id interface{}, vhandler VHandler) int64

通过执行匿名函数实现数据更新关系绑定

func (*ModelSt) SetCacheVer

func (self *ModelSt) SetCacheVer()

设定缓存的版本号数据信息

func (*ModelSt) SetDevTable

func (self *ModelSt) SetDevTable(idx int64) *ModelSt

func (*ModelSt) SetModTable

func (self *ModelSt) SetModTable(idx int64) *ModelSt

func (*ModelSt) SetYmTable

func (self *ModelSt) SetYmTable(format string) *ModelSt

这个时间格式填写golang诞辰 2006-01-02 15:04:05 等

type QuerySt

type QuerySt struct {
	// contains filtered or unexported fields
}

func NewQuery

func NewQuery(dbKey string, fields map[string]reflect.Kind) *QuerySt

生成一个查询Session

func (QuerySt) AsSql

func (q QuerySt) AsSql(mode string) string

获取语句最终拼凑的SQL语句

func (QuerySt) Clear

func (q QuerySt) Clear(parts ...string) *mysqlSt

清除语句的部分信息

func (*QuerySt) CloseDB added in v1.0.3

func (q *QuerySt) CloseDB()

获取当前执行的查询DB信息

func (*QuerySt) Delete

func (q *QuerySt) Delete() int64

执行数据删除操作

func (QuerySt) Duplicate

func (q QuerySt) Duplicate(field string, value interface{}, args ...string) *mysqlSt

更新字段值设置

func (QuerySt) Field

func (q QuerySt) Field(fields string) *mysqlSt

设置要查询的字段信息

func (*QuerySt) GetAsSql

func (q *QuerySt) GetAsSql(sql string, isFirst bool, offset, limit int64) []SqlMap

通过sql语句查询

func (*QuerySt) GetColumn

func (q *QuerySt) GetColumn(offset, limit int64) []string

获取单列信息

func (*QuerySt) GetDb

func (q *QuerySt) GetDb() *sqlx.DB

获取当前执行的查询DB信息 需要及时释放,否则有问题

func (*QuerySt) GetList

func (q *QuerySt) GetList(offset, limit int64) []SqlMap

获取数据信息列表

func (*QuerySt) GetMap

func (q *QuerySt) GetMap(offset, limit int64) SqlMap

获取单列信息 请求设置field 必须 `key`,val结构

func (*QuerySt) GetRow

func (q *QuerySt) GetRow() SqlMap

如果查不到记录返回nil

func (*QuerySt) GetValue

func (q *QuerySt) GetValue() string

获取某个值信息

func (QuerySt) GetWheres

func (q QuerySt) GetWheres() string

获取查询的where数据信息

func (QuerySt) GroupBy

func (q QuerySt) GroupBy(fields ...string) *mysqlSt

设置GroupBy分组

func (QuerySt) Having

func (q QuerySt) Having(having string) *mysqlSt

设置GroupBy Having;一条语句只能设置一次

func (*QuerySt) Insert

func (q *QuerySt) Insert(fields map[string]interface{}, isReplace bool) int64

执行数据插入

func (*QuerySt) NameMap

func (q *QuerySt) NameMap(key string, offset, limit int64) map[string]SqlMap

获取数据信息到数组中

func (QuerySt) OrderBy

func (q QuerySt) OrderBy(field, dir string) *mysqlSt

设置排序信息 允许多列排序

func (QuerySt) Reset

func (q QuerySt) Reset() *mysqlSt

结构体初始化内部结构

func (QuerySt) SetIsReplace

func (q QuerySt) SetIsReplace(isReplace bool) *mysqlSt

设定插入的时候执行replace into

func (QuerySt) Table

func (q QuerySt) Table(table ...string) *mysqlSt

设置查询的表信息

func (*QuerySt) Update

func (q *QuerySt) Update(fields map[string]interface{}) int64

执行数据更新操作

func (QuerySt) Value

func (q QuerySt) Value(field string, value interface{}, args ...string) *mysqlSt

更新字段值设置

func (QuerySt) Where

func (q QuerySt) Where(field string, value interface{}, args ...string) *mysqlSt

添加条件配置

type SqlMap

type SqlMap = map[string]interface{}

func Struct2SqlMap

func Struct2SqlMap(el interface{}, tagName string) (SqlMap, error)

将结构体转换成map的形式

type VHandler

type VHandler func(st *QuerySt) *QuerySt

type WHandler

type WHandler func(st *QuerySt) string

定义注册到条件的数据资料信息

Directories

Path Synopsis
cache module
log module
sqlmap module

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL