zd

package module
v1.1.1-20230510 Latest Latest
Warning

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

Go to latest
Published: May 10, 2023 License: Apache-2.0 Imports: 19 Imported by: 1

README

zorm-md

介绍

后端项目封装。将应用与数据库、前端的逻辑进行封装,在此封装的基础上进行后端项目开发,只需关注在业务逻辑。

软件架构

以 struct 为基础,实现数据库的各类操作封装(Create/Drop/Truncate/Select/Insert/Update/Delete),为 apiFox 提供数据结构所需的 json 代码(camel 格式),生成或更新为前端 vue 所用的 interface。

使用说明

安装达梦(docker)
  1. 下载镜像 https://eco.dameng.com/download/
  2. 安装
    docker load -i dm8_20220822_rev166351_x86_rh6_64_ctm.tar
    docker run -d -p 5236:5236 --restart=always --name dm8 --privileged=true -e PAGE_SIZE=16 -e LD_LIBRARY_PATH=/opt/dmdbms/bin -e INSTANCE_NAME=dm8_01 -v /data/dm8_01:/opt/dmdbms/data dm8_single:v8.1.2.128_ent_x86_64_ctm_pack4
    
数据库操作使用 zorm 框架
  • 初始化 InitDao(dmDSN)

  • 数据表函数(create/drop/truncate)统一为 func[type]()

  • GetTableName 默认取 struct 类别名作为表名(无 schema), 如需改名或增加 schema 则需实现 GetTableName 自定义函数.

  • GetDataType 自定义类型

    • 以 string 的别名, 实现 GetDataType()string 返回 "varchar(nn)", 以实现特定类型的定义, 并在多处重复使用.
工具
  • ToMap 类型转换 map[string]any,处理自定义类型
  • ToUpperMap 类型转 map 并 key 全大写, 以适应数据库字段匹配
  • ToLittleCamelMap 类型转 map key 采用 camel 格式
  • ToLittleCamelJson 类型转 json key 采用 camel 格式
  • StructToJson 转为 json 为 apiFox 使用
数据库
  • Create Table
    • GetTableName
    • GetPrimaryKey
    • GetColumns
    • struct 组合
      • 重名字段的定义以父 struct 为准
      • zorm.Select 遇到重名字段会报错
    • tag: primaryKey/not null/size/default/index/comment
    • tag: unique/check
    • 自定义类型
      • type xxx string
      • type xxx byte
      • DM 读取 char(1)转为 byte 的自定义类型
      • type xxx bool
      • DM 读取 BIT 转为 bool 自定义类型
      • type xxx float64
      • DM 读取 number 转为 float64 自定义类型
    • 基础类型: int float64 bool
  • Drop Table
  • Truncate Table
  • select/find
  • insert
  • update
  • 开启事务
gin
  • Get
  • Post
  • Put
  • Delete
自定义类型转换
/*
自定义 ENUM 类型 type XXX byte
const AAA XXX = '0'
*/
package zd

import (
	"context"
	"database/sql"
	"database/sql/driver"
	"reflect"
	"unsafe"

	"gitee.com/chunanyong/zorm"
)

// RegEnumByteType 自定义 byte 的 enum
func RegEnumByteType() {
	//RegisterCustomDriverValueConver 注册自定义的字段处理逻辑,用于驱动无法直接转换的场景,例如达梦的 TEXT 无法直接转化成 string
	//一般是放到init方法里进行注册
	zorm.RegisterCustomDriverValueConver("dm.CHAR", EnumType{})
}

type EnumType struct{}

// GetDriverValue 根据数据库列类型,返回driver.Value的实例,struct属性类型
// 非struct类型接收,无法获取到structFieldType,会传入nil
func (e EnumType) GetDriverValue(ctx context.Context, columnType *sql.ColumnType, structFieldType *reflect.Type) (driver.Value, error) {
	return new(string), nil
}

// ConverDriverValue 数据库列类型,GetDriverValue返回的driver.Value的临时接收值,struct属性类型
// 非struct类型接收,无法获取到structFieldType,会传入nil
// 返回符合接收类型值的指针,指针,指针!!!!
func (e EnumType) ConverDriverValue(ctx context.Context, columnType *sql.ColumnType, tempDriverValue driver.Value, structFieldType *reflect.Type) (interface{}, error) {
	val := tempDriverValue.(*string)
	if len(*val) == 1 {
		if structFieldType == nil { // map 方式时为 nil(因无法取到 structField)
			return val, nil // zorm.QueryMap 自定义 byte 取值为 "1"
		}
		if kind := (*structFieldType).Kind(); kind == reflect.Uint8 && (*structFieldType).Name() != "uint8" {
			// 变量类型为 structFieldType 否则提示类型不匹配
			c := byte((*val)[0])
			v := reflect.NewAt(*structFieldType, unsafe.Pointer(&c))
			return v.Interface(), nil
		}
	}
	return val, nil
}
示例

sql 增删改查 table 建删清空 gin 简易封装

附:状态码
状态码 英文名称 描述
400 Bad Request 客户端请求的语法错误,服务器无法理解
401 Unauthorized 表示用户没有权限(令牌、用户名、密码错误)
403 Forbidden 没有权限访问该请求,服务器收到请求但拒绝提供服务
404 Not Found 服务器无法根据客户端的请求找到资源(如路径不存在)
405 Method Not Allowed 客户端请求的方法服务端不支持,例如使用 POST 方法请求只支持 GET 方法的接口
406 Not Acceptable 用户 GET 请求的格式不可得(比如用户请求 JSON 格式,但是只有 XML 格式)
408 Request Time-out 客户端请求超时
410 Gone 客户端 GET 请求的资源已经不存在。410 不同于 404,如果资源以前有现在被永久删除了可使用 410 代码,网站设计人员可通过 301 代码指定资源的新位置
415 Unsupported Media Type 通常表示服务器不支持客户端请求首部 Content-Type 指定的数据格式。如在只接受 JSON 格式的 API 中放入 XML 类型的数据并向服务器发送
429 Too Many Requests 客户端的请求次数超过限额

Documentation

Overview

自定义 ENUM 类型 type XXX byte const AAA XXX = '0'

  • @Author: haifengat [email protected]
  • @Date: 2023-05-08 13:14:23
  • @LastEditors: haifengat [email protected]
  • @LastEditTime: 2023-05-10 13:52:39
  • @FilePath: /zorm-dm/gin_ext.go
  • @Description: gin 访问 zorm-dm

Index

Constants

This section is empty.

Variables

View Source
var SchemaName = "SYSDBA" // 模式

Functions

func CreateHandler added in v1.1.2

func CreateHandler(h Handler) gin.HandlerFunc

CreateHandler handler 工厂

用法: r.GET("/users", CreateHandler(HandlerForUserList))

@param Handler handler 业务处理函数
@return gin.HandlerFunc handler 函数

func CreateSchema

func CreateSchema(schemaName string) error

CreateSchema creates a new schema

@param schemaName
@return error

func CreateTable

func CreateTable[T IEntity]() error

CreateTable creates a new table

@return error

func Delete

func Delete[T IEntity](params map[string]any) (int, error)

Delete 删除

@param params map[string]any 删除条件
@return int 删除数量
@return error 错误

func DeleteByName added in v1.0.12

func DeleteByName(tblName string, params map[string]any) (int, error)

DeleteByName 根据表名删除

@param tblName string 表名
@param params map[string]any 删除条件
@return int 删除数量
@return error 错误

func DeleteObject

func DeleteObject[T IEntity](c *gin.Context)

DeleteObject delete

@param c

func DropTable

func DropTable[T IEntity]() error

DropTable drops a table

@return error

func ExecuteSql added in v1.0.18

func ExecuteSql(sqlStr string, values ...any) (int, error)

ExecuteSql 执行 sql 语句

@param sqlStr string sql进行查询
@param values ...any sql中?对应的结果
@return int 返回影响的行数
@return error 错误

func GetColumnName

func GetColumnName(tblName string) []string

GetColumnName 取列名(从dm库中取)

@param tblName 表名,格式: SchemaName.TblName
@return []string 列名表

func GetObjects

func GetObjects[T IEntity](c *gin.Context)

GetObjects find

@param c 示例:{"pageInfo": {"PageNo": 1,"PageSize": 30}, "qry": {"ID": "ZhangSan"}, "append": "order by ID desc"}

func GetPrimaryKey

func GetPrimaryKey[T IEntity]() []string

GetPrimaryKey 取表的主键

@return []string 主键(全大写)

func GetPrimaryKeyByName added in v1.0.13

func GetPrimaryKeyByName(tblName string) ([]string, error)

GetPrimaryKeyByName 获取主键

@param tblName string 表名
@return []string 主键名称
@return error 错误

func GetTableName

func GetTableName[T IEntity]() string

GetTableName 取表名

@return string SchemaName.TblName(大写)

func InitDao

func InitDao(dmDSN string) (context.Context, error)

InitDao 初始化数据库

注册自定义类型: RegEnumByteType RegBoolType(dm.BIT) RegNumberType(dm.NUMBER,dm.NUMERIC)

@param dmDSN string dm://SYSDBA:SYSDBA001@localhost:5236
@return context.Context 数据层上下文
@return error 错误

func InitDaoOracle added in v1.0.16

func InitDaoOracle(crmsDSN string) (context.Context, error)

InitDaoOracle 初始化 oracle

应用需要 import _ "github.com/godror/godror"

Go数据库驱动列表:https://github.com/golang/go/wiki/SQLDrivers

@param crmsDSN string
@return context.Context 数据上下文
@return error 错误

func Insert

func Insert[T IEntity](entities ...T) error

Insert 插入数据(不要用指针类型!!!不要用指针类型!!!不要用指针类型!!!)

不过滤空值: struct 初始化的字段也会入库, 如 string 字段会以*空白字串*入库

@param entities ...T 插入数据
@return error 错误

func InsertMap added in v1.0.12

func InsertMap[T IEntity](entities ...map[string]any) error

InsertMap 插入数据

@param entities ...map[string]any 插入数据
@return error 错误

func InsertMapByName added in v1.0.12

func InsertMapByName(tblName string, entities ...map[string]any) error

InsertMapByName 根据表名插入数据

@param tblName string  表名
@param entities ...map[string]any 插入数据
@return error 错误

func InsertNotZero added in v1.0.16

func InsertNotZero[T IEntity](entities ...T) error

InsertNotZero 插入数据(不要用指针类型!!!不要用指针类型!!!不要用指针类型!!!)

过滤0值(bool:false, int:0, string:""), string字段入库后为 NULL

@param entities ...T 插入数据
@return error 错误

func PostObject

func PostObject[T IEntity](c *gin.Context)

PostObject insert

@param c

func PutObject

func PutObject[T IEntity](c *gin.Context)

PutObject update

@param c 示例:{"where": {"ID": "5472"},"set": {"IsActive": "1"}}

func QueryMap added in v1.0.16

func QueryMap(sqlStr string, values ...any) ([]map[string]any, error)

QueryMap 执行sql指令进行查询

用于多表联查,或其他复杂的情况

@param sqlStr string sql进行查询
@param values ...any sql中?对应的值
@return []map[string]any 结果集
@return error 错误

func RegBoolType added in v1.0.18

func RegBoolType()

RegBoolType 注册自定义 bool 类型

func RegEnumByteType added in v1.0.18

func RegEnumByteType()

RegEnumByteType 自定义 byte 的 enum

func RegNumberType added in v1.0.18

func RegNumberType()

RegNumberType dm 和 oracle Number/Numeric 类型转为 float64

func ResponseErr

func ResponseErr(c *gin.Context, err error, datas ...any)

ResponseErr 错误响应

@param c
@param err error 用 UnWrap 解析
@param datas 与 data data2 对应

func ResponseOK

func ResponseOK(c *gin.Context, datas ...any)

ResponseOK 正确响应

@param c
@param datas 与 data data2 对应

func Select

func Select[T IEntity](p *PageInfo, params map[string]any, sqlStrAppend ...string) ([]T, error)

Select 查询, 返回 struct

@param p *PageInfo 分页
@param params map[string]any 查询条件
@param sqlStrAppend string sql拓展, 如 order by xxx, 不会被 fnd 替换
@return []T 返回结果集
@return error 错误

func SelectByStruct added in v1.0.16

func SelectByStruct[T IEntity](p *PageInfo, t T, sqlStrAppend ...string) ([]T, error)

SelectByStruct 查询,条件用 IEntity 实例, 返回 struct

@param p *PageInfo 分页
@param t T 只接受非0值, 若查查询 bool:false int:0 string:"" 的条件,可在 sqlStrAppend 拼接
@param sqlStrAppend string sql拓展, 如 order by xxx, 不会被 fnd 替换
@return []T 返回结果集
@return error 错误

func SelectCount

func SelectCount[T IEntity](where map[string]any) (int, error)

SelectCount 查询 count(1)

@param where map[string]any 查询条件
@return int count(1)
@return error 错误

func SelectCountByName added in v1.0.9

func SelectCountByName(tblName string, where map[string]any) (int, error)

SelectCountByName 根据表名查询 count(1)

@param tblName string 表名
@param where map[string]any 查询条件
@return int count(1)
@return error 错误

func SelectMap

func SelectMap[T IEntity](p *PageInfo, params map[string]any, sqlStrAppend ...string) ([]map[string]any, error)

SelectMap 查询返回 map

@param p *PageInfo 分页
@param params map[string]any 查询条件
@param sqlStrAppend string sql拓展, 如 order by xxx, 不会被 fnd 替换
@return []map[string]any 返回结果集
@return error 错误

func SelectMapByName

func SelectMapByName(tblName string, p *PageInfo, params map[string]any, sqlStrAppend ...string) ([]map[string]any, error)

SelectMapByName 根据表名查询, 返回 map

@param tblName string 表名
@param p *PageInfo 分页
@param params map[string]any 查询条件
@param sqlStrAppend string sql拓展, 如 order by xxx, 不会被 fnd 替换
@return []map[string]any 返回结果集
@return error 错误

func SelectMapColumns added in v1.0.9

func SelectMapColumns[T IEntity](p *PageInfo, params map[string]any, columns []string, sqlStrAppend ...string) ([]map[string]any, error)

SelectMapColumns 返回 map, 指定字段名

@param p *PageInfo 分页
@param params map[string]any 查询条件
@param columns []string 查询列
@param sqlStrAppend string sql拓展, 如 order by xxx, 不会被 fnd 替换
@return []map[string]any 返回结果集
@return error 错误

func SelectMapColumnsByName added in v1.0.9

func SelectMapColumnsByName(tblName string, p *PageInfo, params map[string]any, columns []string, sqlStrAppend ...string) ([]map[string]any, error)

SelectMapColumnsByName 根据表名查询, 返回 map 指定列名

**所有 SelectMap 基于此**

@param tblName string 表名
@param p *PageInfo 分页
@param params map[string]any 查询条件
@param columns []string 查询列
@param sqlStrAppend string sql拓展, 如 order by xxx, 不会被 fnd 替换
@return []map[string]any 返回结果集
@return error 错误

func SelectRow added in v1.0.9

func SelectRow[T IEntity](columnName string, params map[string]any, sqlStrAppend ...string) (any, error)

SelectRow 查询首行指定列的值

@param columnName string 列名
@param params map[string]any 查询条件
@param sqlStrAppend string sql拓展, 如 order by xxx, 不会被 fnd 替换
@return any 无效查询返回  nil
@return error

func SelectRowByName added in v1.0.9

func SelectRowByName(tblName string, columnName string, params map[string]any, sqlStrAppend ...string) (any, error)

SelectRowByName 查询首行指定列的值

@param tblName string 表名
@param columnName string 列名
@param params map[string]any 查询条件
@param sqlStrAppend string sql拓展, 如 order by xxx, 不会被 fnd 替换
@return any 无效查询返回 nil
@return error

func SetDefaultCtx added in v1.0.16

func SetDefaultCtx(ctx context.Context)

SetDefaultCtx 设置默认 ctx

@param ctx context.Context 用于多个 context 时切换, 之后执行 sql 时对应此 context

func StructToMap added in v1.1.2

func StructToMap(t any, filterZeroField, filterAutoIncrementField bool) map[string]any

StructToMap 结构体转 map

@param t any 不能是指针!!!
@param filterZeroField bool 过滤0值字段(bool-false, int-0, string-"", nil)
@param filterAutoIncrementField bool 过滤自增字段(用于 insert)
@return map [string]any 结果数据

func TableExists

func TableExists(tblName string) bool

TableExists 判断表是否存在

@param tblName string 表名
@return bool 是否存在

func ToLittleCamelMap

func ToLittleCamelMap(t any) map[string]any

ToLittleCamelMap 小写 camel

@param t
@return map [string]any 结果数据(ID转id)

func ToUpperMap

func ToUpperMap(t any) map[string]any

ToUpperMap

@param t
@return map

func Transaction

func Transaction(fun func() error) error

Transaction 使用事务

@param fun func() error 使用了什么代码就抛出什么错误
@return error 错误

func TrunTable

func TrunTable[T IEntity]() error

TrunTable truncates a table

@return error

func Update

func Update[T IEntity](entities ...T) (int, error)

Update 更新 Struct

@param entities ...T 替换数据(**不能是指针! 不能是指针! 不能是指针!**)
@return int 替换数量
@return error 错误

func UpdateMap added in v1.0.12

func UpdateMap[T IEntity](where map[string]any, set map[string]any) (int, error)

UpdateMap UpdateOne 更新(单个条件)

@param where map[string]any 查询条件
@param set map[string]any 替换数据
@return int 替换数量
@return error 错误

func UpdateMapByName added in v1.0.12

func UpdateMapByName(tblName string, where map[string]any, set map[string]any) (int, error)

UpdateMapByName 根据表名更新(单个条件)

@param tblName string 表名
@param where map[string]any 查询条件
@param set map[string]any 替换数据
@return int 替换数量
@return error 错误

func UpdateMapConditions added in v1.0.12

func UpdateMapConditions[T IEntity](wheres []map[string]any, set map[string]any) (int, error)

UpdateMapConditions 更新(多条件)

@param wheres []map[string]any 查询条件
@param set map[string]any 替换数据
@return int 替换数量
@return error 错误

func UpdateMapConditionsByName added in v1.0.12

func UpdateMapConditionsByName(tblName string, wheres []map[string]any, set map[string]any) (int, error)

UpdateMapConditionsByName 根据表名更新

所有 Update 基于此

@param tblName string 表名
@param wheres []map[string]any 查询条件
@param set map[string]any 替换数据
@return int 替换数量(更新数据量为 0 没有符合条件的数据)
@return error 错误

Types

type BoolType added in v1.0.18

type BoolType struct{}

func (BoolType) ConverDriverValue added in v1.0.18

func (e BoolType) ConverDriverValue(ctx context.Context, columnType *sql.ColumnType, tempDriverValue driver.Value, structFieldType *reflect.Type) (interface{}, error)

ConverDriverValue 数据库列类型,GetDriverValue返回的driver.Value的临时接收值,struct属性类型 非struct类型接收,无法获取到structFieldType,会传入nil 返回符合接收类型值的指针,指针,指针!!!!

func (BoolType) GetDriverValue added in v1.0.18

func (e BoolType) GetDriverValue(ctx context.Context, columnType *sql.ColumnType, structFieldType *reflect.Type) (driver.Value, error)

GetDriverValue 根据数据库列类型,返回driver.Value的实例,struct属性类型 非struct类型接收,无法获取到structFieldType,会传入nil

type Entity

type Entity struct{}

Entity 实现 IEntity

func (Entity) GetDefaultValueMap added in v1.1.1

func (Entity) GetDefaultValueMap() map[string]interface{}

GetDefaultValueMap 获取列的默认值Map,用于Insert和Update Struct对象,UpdateNotZeroValue请使用BindContextMustUpdate方法.返回map的key是Struct属性名,value是默认值,value可以是nil.

func (Entity) GetPKColumnName

func (Entity) GetPKColumnName() string

用 GetPrimaryKey[T] 替代

func (Entity) GetPkSequence

func (Entity) GetPkSequence() string

func (Entity) GetPrimaryKey

func (Entity) GetPrimaryKey() []string

GetPrimaryKey 表的主键, 返回 nil 时忽略此函数; 否则以此函数为准, 忽略 tag中的 primaryKey 配置

func (Entity) GetTableName

func (Entity) GetTableName() string

GetTableName 返回struct类型名;需要struct自行实现

type EnumType

type EnumType struct{}

func (EnumType) ConverDriverValue

func (e EnumType) ConverDriverValue(ctx context.Context, columnType *sql.ColumnType, tempDriverValue driver.Value, structFieldType *reflect.Type) (interface{}, error)

ConverDriverValue 数据库列类型,GetDriverValue返回的driver.Value的临时接收值,struct属性类型 非struct类型接收,无法获取到structFieldType,会传入nil 返回符合接收类型值的指针,指针,指针!!!!

func (EnumType) GetDriverValue

func (e EnumType) GetDriverValue(ctx context.Context, columnType *sql.ColumnType, structFieldType *reflect.Type) (driver.Value, error)

GetDriverValue 根据数据库列类型,返回driver.Value的实例,struct属性类型 非struct类型接收,无法获取到structFieldType,会传入nil

type Handler added in v1.1.2

type Handler func(ctx *gin.Context) (data any, data2 any, errRtn error)

type IEntity

type IEntity interface {
	zorm.IEntityStruct
	GetPrimaryKey() []string // 主键
}

type NumericType added in v1.0.14

type NumericType struct{}

func (NumericType) ConverDriverValue added in v1.0.14

func (e NumericType) ConverDriverValue(ctx context.Context, columnType *sql.ColumnType, tempDriverValue driver.Value, structFieldType *reflect.Type) (interface{}, error)

ConverDriverValue 数据库列类型,GetDriverValue返回的driver.Value的临时接收值,struct属性类型 非struct类型接收,无法获取到structFieldType,会传入nil 返回符合接收类型值的指针,指针,指针!!!!

func (NumericType) GetDriverValue added in v1.0.14

func (e NumericType) GetDriverValue(ctx context.Context, columnType *sql.ColumnType, structFieldType *reflect.Type) (driver.Value, error)

GetDriverValue 根据数据库列类型,返回driver.Value的实例,struct属性类型 非struct类型接收,无法获取到structFieldType,会传入nil

type PageInfo

type PageInfo struct {
	PageNo     int `json:"pageNo,omitempty"`
	PageSize   int `json:"pageSize,omitempty"`
	TotalCount int `json:"totalCount,omitempty"`
}

PageInfo 分页数据

func GetQryParams

func GetQryParams(c *gin.Context) (p *PageInfo, params map[string]any, sqlAppend string)

GetQryParams 取gin的请求参数

@param c 示例:{"pageInfo": {"PageNo": 1,"PageSize": 30}, "qry": {"ID": "ZhangSan"}, "append": "order by ID desc"}
@return p 分页
@return params 查询参数
@return sqlAppend 追加(order group....)

type Response

type Response struct {
	Status string `json:"status"` // success 或 failure
	Msg    string `json:"msg"`
	// GetObjects 函数返回 查询的结果集
	Data interface{} `json:"data"`
	// GetObjects 函数返回 PageInfo
	Data2 interface{} `json:"data2"`
}

Response 响应体

type TableColumn

type TableColumn struct {
	ColumnName      string // 数据表字段名(字段名or由columns定义)
	StructFieldName string // 结构体字段名称
	ColumnType      string // 数据表中的类型定义
	Comment         string
	PrimaryKey      bool
	NotNull         bool
	Unique          bool
	Index           bool
	AutoIncrement   bool // 自增
	Default         string
}

TableColumn 数据列定义

func GetColumns

func GetColumns[T IEntity]() []TableColumn

GetColumns 取列定义

@return []TableColumn 数据列定义表(列名大写)

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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