directsql

package
v1.4.0 Latest Latest
Warning

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

Go to latest
Published: Jun 26, 2022 License: Apache-2.0 Imports: 23 Imported by: 0

README

directSQL 使用说明

升级

2018.08.26 的 default 增加2个默认参数 - int64uuid :64位整数长度的唯一id (通过配置机器节点支持分布式唯一id生成) - shortuuid :短字符串的唯一id(将int64uuid转为36进制的值(10个数字+26个字母组成的)) 2018.08.22 sql节点配置增加 eachtran 属性,配置 batchexec、batchmultiexec类型生成的所有SQL是否一个事务中执行,默认为false,true的则每个批次循环在不同的事务。 batchexec 类型SQL支持配置多个sql
2017.08 增加两种类型的sql,处理二进制对象保存到数据库和从数据库获取 - getblob: ST_GETBLOB 获取BLOB (binary large object),二进制大对象从数据库 - setblob: ST_SETBLOB 保存BLOB (binary large object),二进制大对象到数据库

简介

directSQL通过配置sql映射文件,配置路由后可直接执行配置的sql并返回结果到客户端。

直接执行SQL引擎

- 通过url直接执行SQL,参数采用POST方式传递  /bos/... sql标示
- sqlengine--API执行sql的引擎
- sqlhandle--处理执行请求的handle(API)
- sqlrouter--SQL路由处理
- sqlmanage--管理维护SQL定义文件到内存中
- sqlservice--通过代码调用的接口单元
- checkparameter -- 参数处理(参数验证与默认参数处理)
- resultcache --查询结果缓存处理单元
- sqlcontext --sql参数默认值的自定义函数单元
- sqlhelper--辅助函数
- sqlwatcher--SQL配置文件监控自动更新(  实现文件修改,删除监控,改名,新增貌似不行)
- 系统中通过代码如何调用:
    directsql/sqlService 单元中的函数

配置文件:

config/directsql.ini 的内容
 `
;SQL配置文件扩展名,只能一个。
ext=.msql 
;是否懒惰加载,true 第一次请求才加载请求的sqlmodel文件然后缓存(未实现),false=一开始就根据配置的roots目录全部加载
lazyload=false 
;是否开始监控所有roots目录下的配置文件变化,改变自动处理(增加,删除,修改)
watch=true
;global,全局属性 是否启用查询数据缓存功能,启用则配置sql中配置属性cached=true 才有效,否则一律不缓存 
cached=true
;global 全局属性 默认缓存的时间,如果使用缓存并且未配置缓存时间则使用该默认时间,单位为分钟,-1为一直有效,-2为一月,-3为一周 -4为一天,单位为分钟。
cachetime=30
;SQL配置文件加载的根目录,可以个多个,定义后自动将真实文件名映射到前边名称
[roots]
biz=bizmodel  ; 比如: 系统根目录/bizmodel/plan/main.msql 访问url为 bos/biz/plan/main
sys=sysmodel  ; 比如: 系统根目录/sysmodel/admin/users.msql 访问url为 bos/sys/admin/users `

SQL节点属性

<sql type=""  id=""  eachtran="false/true">
   type=全局SQL类型
   id= 此SQSL唯一标识(调用依据)
   desc=此SQL说明
   eachtran= 此节点(batchexec、batchmultiexec有效,其他类型无效)生成的所有SQL在一个事务中执行,默认为 false 
                   true 则每个批次的SQL在一个事务中执行。     

全部SQL类型

配置类型                      内部类型                          说明 
- select                       ST_SELECT       Tsqltype = iota  //0=普通查询,只能配置一个查询语句返回一个结果集   
- pagingselect                 ST_PAGINGSELECT                  //1=分页查询,配置一个总数sql语句,一个分页查询语句,返回总页数与一个结果集
- multiselect                  ST_MULTISELECT                   //3=多结果集查询,配置多个查询语句并返回多个结果集
- exec/delete                  ST_EXEC                          //4=删除,可以配置多个sql语句,在一个事务中依次执行 
       insert                  ST_EXEC                          //  插入,可以配置多个sql语句,在一个事务中依次执行
       update                  ST_EXEC                          //  更新,可以配置多个sql语句,在一个事务中依次执行 
- batchexec/batchinsert        ST_BATCHEXEC                     // 单个事务中执行 5=批量插入,配置多个sql,根据参数循环执行(单数据集批量插入)
            batchupdate        ST_BATCHEXEC                     //  批量更新,配置多个sql,根据参数循环执行(单数据集批量更新)
- batchmultiexec/batchcomplex  ST_BATCHMULTIEXEC                //6=批量复合SQL,配置多个sql(一般多数据集批量插入或更新)
- getblob                      ST_GETBLOB                       //从数据库获取二进制内容
- setblob                      ST_SETBLOB                       //保存二进制内容到数据库

客户端传入参数

- select/pagingselect/multiselect/exec(delete/insert/update/getblob/setblob)参数,简单json参数 
     {"id":"001","name":"aaaaa"}
    其中参数中可包含:
     - "callback":"可选参数,不为空时返回JSONP"(仅适用于 select/pagingselect/multiselect),
     - "start":"可选参数,分页查询时需要 开始记录数"(仅适用于 pagingselect),
     - "limted":"可选参数,分页查询时需要 每页记录数"(仅适用于 pagingselect),


- batchexec(batchinsert/batchupdate)参数,简单批量json参数(数组)
    [{"id":"001","name":"aaaaa"},{"id":"002","name":"bbbbb"},{"id":"003","name":"ccc"}]
    分别循环数组中的 json对象调用配置的sql
-  
- batchmultiexec/batchcomplexc参数,复杂批量json参数
    {"main":[{"id":"01","name":"aaaaa"},{"id":"002","name":"bbbbb"}],
    "sub1":[{"id":"0111","pid":"01","name":"sub11"},{"id":"0112","pid":"01","name":"sub12"}]
    "sub2":[{"id":"0121","pid":"01","name":"sub21"},{"id":"0122","pid":"01","name":"sub22"}]
    }
     参数main,sub1,sub2分别对应配置的三个cmd的sql参数(每个cmd可以批量执行,同batchexec)

参数配置

`<parameter type="string" name="code" desc="用户帐号" required="true" minlen="5" maxlen="50" default="usercode" return="true"/> `
- parameter的属性说明
     - name: 参数名称,必须与SQL中的参数名称对应,即?name
     - desc: 参数描述
     - type:参数类型 string/int/float/date/datetime/email/blob 会根据类型进行验证                 
     - required: true 不能为空,也就是其转换为字符串长度>0   false 可以为空
     - minlen: 最小长度(只适用于 type=string) 
     - maxlen: 最大长度(只适用于 type=string) 
     - minvalue: 最小值(只适用于 type=int/float) 
     - maxvalue: 最大值(只适用于 type=int/float) 
     - cached : 是否缓存结果,0=不缓存 1=缓存,缓存的时间由cachetime确定(如果没有配置cachetime则自动为30分钟),只对 select,multiselect,pagingselect(第一页)有效
     - cachetime :缓存有效时间,不配置或配置为0时 默认为directsql.config的参数分钟,-1为一直有效,-2为一月,-3为一周,单位为分钟。 
     - return: 是否返回,0或不配置为不返回,1为返回该值到客户端,(只适用于带有服务端默认值的才起作用)
     - parentid 是否是作为parentid 使用,0或不配置则不作为父id使用,配置为1则作为从表的与主表关联的父id使用,在SQL类型为batchcomplexc 的作为主从表(一主多从,主表只有一条记录)的从表的父id使用,从表的 SQL参数中需要配置 default类的取值为 parentid,则系统自动用主表的这个值设置到从表的这个参数值中  
     - default: 服务端默认值:如果存在服务端默认值定义则客户端传入参数时可以不传由服务端处理并不执行验证规则(如果客户端传入了则使用客户端的值,并执行服务端的规则验证),
        默认参数取值如下:
         - uuid: 生成新的uuid(36位全球唯一id)
         - int64uuid :64位整数长度的唯一id 
         - shortuuid :短字符串的唯一id(将int64uuid转为36进制的值(10个数字+26个字母组成的))
         - nowdate: 当前服务器日期
         - now: 当前服务器日期时间 
         - nowunix: 当前服务器日期时间 unix格式(64位整数)
         - parentid :父id,在SQL类型为batchcomplexc 的作为主从表(一主多从,主表只有一条记录)的从表的父id使用
         - {value} :直接默认值,用{...}包裹的值直接作为参数默认值,例如 { },{0}
         - 自注册函数取值默认值                
            默认参数取值扩展定义并使用
           1)编写函数 参数必须为*faygo.Context:
              func name(ctx *faygo.Context) interface{
                  ...
              }
           2)注册函数
              RegAny("name",func)
           3)SQL默认参数配置,系统会自动解析调用
            <parameters>
                <parameter name="id" desc="用户id" type="string" required="true" maxlen="36" minlen="36" default="name" return="true"/>
            </parameters>

查询结果缓存

- 首先在 directsql.ini中进行配置全局参数
   ;是否启用查询数据缓存功能,启用则配置sql中配置属性cached=true 才有效,否则一律不缓存
   cached=true
   ;默认缓存的时间,如果使用缓存并且未配置缓存时间则使用该默认时间,单位为分钟,-1为一直有效,-2为一月,-3为一周 -4为一天,单位为分钟。
  defaultcachetime=30    
- 在sql配置文件中的sql节点配置 属性
   - cached : 是否缓存结果,0=不缓存 1=缓存,缓存的时间由cachetime确定(如果没有配置cachetime则自动为30分钟),只对 select,multiselect,pagingselect(第一页)有效
   - cachetime :缓存有效时间,不配置或配置为0时 默认为directsql.ini的参数分钟,-1为一直有效,-2为一月,-3为一周,单位为分钟。 
- 说明
   - 缓存的key值用 执行请求的路径(/sys/home/select), 参数名与参数值对作为suffix,进行确定换成值,对于同一个sql只缓存一次,就是第一次执行的参数的结果,其他的参数查询不缓存;对于没有参数的结果缓存suffix=nil  

完整示例

```<!-- id为本model的标识一般同文件名,database为xorm.ini中配置的数据库名称,为执行该配置文件sql的连接,空为默认数据库 -->
   <model id="demo" database="">
    <comment>
        <desc>DirectSQL功能测试SQL定义</desc>
        <author></author>
        <date>2016-06-20</date>
        <history Editor="畅雨" Date="2016-08-03">完善并增加注释</history>
    </comment>
    <!-- JSON参数示例:{'code':'12345'} -->
    <sql type="select" id="select" desc="查询SQL,结果缓存30分钟" cached="true" cachetime="30">
        <cmd in="" out="">
            <![CDATA[ select * from sys_user where code=?code ]]>
            <parameters>
                <parameter type="string" name="code" desc="用户帐号" required="true" minlen="5" maxlen="50"/>
            </parameters>
        </cmd>
    </sql>
    <!-- JSON参数示例:{'name':'李四','start':1,'limted':20 } -->
    <sql type="pagingselect" id="paging" desc="服务端分页查询,第一个cmd=总页数SQL,第二个cmd=分页的查询数据sql">
        <cmd in="" out="total">
            <![CDATA[ SELECT count(id) AS total FROM sys_user ]]>
        </cmd>
        <cmd in="" out="data">
            <![CDATA[ SELECT * FROM sys_user LIMIT ?start,?limted ]]>
            <parameters>
                <parameter  name="start" desc="start" type="int" required="true" />
                <parameter  name="limted" desc="size" type="int" required="true" />
            </parameters>
        </cmd>
    </sql>
     <!-- JSON参数示例:{'code':'12345'} -->
    <sql type="nestedselect" id="nested" desc="嵌套的结果json---已作废" idfield="id" pidfield="pid">
        <cmd in="" out="">
            <![CDATA[ SELECT * FROM sys_sys_user ]]>
        </cmd>
    </sql>
     <!-- JSON参数示例:{'code':'12345','nick':'changyu'} -->
    <sql type="multiselect" id="multi" desc="多个Select返回多个结果集的查询组合,一个json参数">
        <cmd in="" out="main">
            <![CDATA[  SELECT id,code FROM sys_user where code=?code ]]>
            <parameters>
                <parameter type="string" name="code" desc="用户帐号" required="true" minlen="5" maxlen="50" />
            </parameters>
        </cmd>
        <cmd in="" out="detail1">
            <![CDATA[   SELECT id,code,pwd,nick FROM sys_user   ]]>
        </cmd>
        <cmd in="" out="detail2">
            <![CDATA[   SELECT id,code,cnname,pwd,nick FROM sys_user WHERE nick=?nick   ]]>
            <parameters>
                <parameter type="string" name="nick" desc="用户帐号" required="true" />
            </parameters>
        </cmd>
    </sql>
    <!-- JSON参数示例:{'code':'123'} -->
    <sql type="delete" id="delete" desc="删除,可以执行多条删除语句,建议类型改为 exec">
        <cmd in="" out="">
            <![CDATA[   DELETE FROM sys_user where code=?code   ]]>
            <parameters>
                <parameter name="code" desc="用户帐号" type="string" required="true" />
            </parameters>
        </cmd>
        <cmd in="" out="">
            <![CDATA[   DELETE FROM sys_userdetail where pcode=?code   ]]>
            <parameters>
                <parameter name="code" desc="用户帐号" type="string" required="true" />
            </parameters>
        </cmd>
    </sql>
    <!-- JSON参数示例:{'code':'123','name':'xxx'} -->
    <sql type="insert" id="insert" desc="新增服务端生成newid返回,建议类型改为 exec">
        <cmd in="" out="">
            <![CDATA[       INSERT INTO sys_user(id,code,cnname,pwd,nick) VALUES(?id,?code,?cnname,?pwd,?nick) ]]>
            <parameters>
                <parameter name="id" desc="用户id" type="string" required="true" maxlen="36" minlen="36" default="uuid" return="true"/>
                <parameter name="code" desc="用户帐号" type="string" required="true" maxlen="50" minlen="5" />
                <parameter name="cnname" desc="cnname" type="string" required="true" />
                <parameter name="nick" desc="昵称" type="string" required="true" maxlen="30" minlen="0" />
            </parameters>
        </cmd>
    </sql>
    <!-- JSON参数示例:{'code':'123','nick':'xxx'} -->
    <sql type="update" id="update" desc="更新,建议类型改为 exec" >
        <cmd in="" out="">
            <![CDATA[ update sys_user set nick=?nick where code=?code ]]>
            <parameters>
                <parameter type="string" name="code" desc="用户帐号" required="true" />
                <parameter type="string" name="nick" desc="用户帐号" required="true" />
            </parameters>
        </cmd>
    </sql>
    <!-- JSON参数示例:{'code':'123','nick':'xxx'} -->
    <sql type="insert" id="save" desc="保存(插入或更新),建议类型改为 exec" >
        <cmd in="" out="">
            <![CDATA[ INSERT INTO sys_user(uid,code,pwd,nick,login_ip,login_time,regist_time) VALUES(?uid,?code,?pwd,?nick,?login_ip,?login_time,?regist_time) ON DUPLICATE KEY UPDATE nick=?nick   ]]>
            <parameters>
                <parameter type="string" name="id" desc="id" required="true" default="uuid" return="true"/>
            </parameters>
        </cmd>
    </sql>
    <!-- JSON参数示例:  [{"id":"001","name":"aaaaa"},{"id":"002","name":"bbbbb"},{"id":"003","name":"ccc"}] -->
    <sql type="batchinsert" id="batchinsert" desc="批量新增,json传来多条数据,一个批次插入,要么全部成功要么全部失败">
        <cmd in="" out="">
            <![CDATA[ INSERT INTO sys_user(id,code,cnname,pwd,nick) VALUES(?id,?code,?cnname,?pwd,?nick)            ]]>
            <parameters>
                <parameter type="string" name="id" desc="用户帐号" required="true" minlen="30" default="uuid" return="true"/>
            </parameters>
        </cmd>
    </sql>
    <!-- JSON参数示例:[{"id":"001","name":"aaaaa"},{"id":"002","name":"bbbbb"},{"id":"003","name":"ccc"}]-->
    <sql type="batchupdate" id="bacthsave" desc="批量更新,json传来多条数据,一个批次更新,要么全部成功要么全部失败">
        <cmd in="" out="">
            <![CDATA[   INSERT INTO sys_user(id,code,cnname,pwd,nick) VALUES(?id,?code,?cnname,?pwd,?nick)     ]]>
        </cmd>
    </sql>
        <!-- JSON参数示例:  [{"id":"001","name":"aaaaa"},{"id":"002","name":"bbbbb"},{"id":"003","name":"ccc"}]  -->
    <sql type="batchdelete" id="delete" desc="批量删除,根据参数多次执行该语句">
        <cmd in="" out="">
            <![CDATA[   DELETE FROM sys_user where code=?code   ]]>
            <parameters>
                <parameter name="code" desc="用户帐号" type="string" required="true" />
            </parameters>
        </cmd>
    </sql>
    <!-- JSON参数示例:{main:[{'id':'123','name':'xxx'}],detail1:[{},...],detail2:[{},...]} -->
    <sql type="batchmultiexec" id="bacthcomplexsave" desc="批量在一个事务里边组合执行多个表的保存,要么全部成功要么全部失败">
        <cmd in="main" desc="主表的数据,支持多条">
            <![CDATA[   INSERT INTO sys_user(id,code,cnname,pwd,nick) VALUES(?id,?code,?cnname,?pwd,?nick) ]]>
            <parameters>
                <parameter type="string" name="id" desc="用户帐号" required="true" default="uuid" />
            </parameters>
        </cmd>
        <cmd in="detail1" desc="子表一数据,支持多条">
            <![CDATA[  INSERT INTO sys_user(id,code,cnname,pwd,nick) VALUES(?id,?code,?cnname,?pwd,?nick)]]>
        </cmd>
        <cmd in="detail2" desc="子表二数据,支持多条">
            <![CDATA[  INSERT INTO sys_user(id,code,cnname,pwd,nick) VALUES(?id,?code,?cnname,?pwd,?nick)   ]]>
        </cmd>
        <!-- 下面可继续添加多个组合进来的sql -->
    </sql>
    <!-- 下面可继续添加新的方法 -->
  </model>

## 存在问题
 - nestedselect-返回嵌套JSON的未实现,放到客户端用js实现
   参考函数:
   `
         /**
          * 将通过id,parentid表达的父子关系列表转换为树形
          * @param {object} data 数据列表
          * @param {string} id 主键
          * @param {string} parentid 父id
          * @returns {json} 
          */
          getNestedJSON = function(data, id, parentid) {
             if ((data === null) || (data == "[]")) {
                 return [];
             }
             // create a name: node map
             var dataMap = data.reduce(function(map, node) {
                 map[node[id]] = node;
                 return map;
             }, {});
             // create the tree array
             var tree = [];
             data.forEach(function(node) {
                 // add to parent
                 var parent = dataMap[node[parentid]];
                 if (parent) {
                     // create child array if it doesn't exist
                     (parent.children || (parent.children = []))
                     // add node to child array
                     .push(node);
                 } else {
                     // parent is null or missing
                     tree.push(node);
                 }
             });
             return tree;
         }
   `
 - sqlwatcher中不能监控改名的文件(可以通过重新载入解决)

Documentation

Overview

*

  • desc : 参数校验函数
  • author : 畅雨
  • date : 2016.12.13
  • desc :
  • history : 2018.06.15:
  • 默认参数增加直接设置值类型,DT_VALUE,格式{value} ,示例:{""},{0} 2017.05.28
  • 增加主从表关联id的服务端处理。

* * func : 查询sql结果缓存处理单元 * author : 畅雨 * date : 2016.11.25 * desc : 缓存查询的结果 * history :

  • 2106.11.30 -优化缓存的存储

* * func : 查询sql的参数默认值 shortuuid 与 intuuid的处理单元 * author : 畅雨 * date : 2018.8.26 * desc : * history :

* * func : sql参数值的服务端来源定义 * author : 畅雨 * date : 2016.12.17 * desc : 可以将常量,变量,函数的值提供给sql参数的服务端默认值,通过reg函数注册到Context(MAP)中,在SQL的参数中通过名字进行调用得到值作为sql参数的值 * history :

* * func : 动态SQL执行引擎 * author : 畅雨参数校验函数 * date : 2016.06.13 * desc : 关联关系全部通Id进行关联 * history :

		 -2018.12.18
		    -配置参数增加,批量SQL的事务处理:全部一个事务还是分开不同的事务中。
         - 2017.03.22
			-增加两种类型的sql,处理二进制对象保存到数据库和从数据库获取:
         	 ST_GETBLOB  //10 获取BLOB (binary large object),二进制大对象从数据库
	         ST_SETBLOB  //11 保存BLOB (binary large object),二进制大对象到数据库
         -2016.11.20 将执行sql的execMap修改该可以执行多个配置的cmd,采用相同的参数

*

  • desc : 请求处理handle
  • author:畅雨
  • date: 2016.10.27
  • history: 2017.03.22 增加 单独的获取与保存二进制文件到数据库配置项 2016.10.17:优化 select与pagingselect返回结果,当数据为空时返回[]

*

功能:辅助函数

*

  • desc : 管理动态SQL,根据配置文件目录从配置文件加载到内存中

  • author : 畅雨

  • date : 2016.12.13

  • desc :

  • history: 2018.08.22 sql节点配置增加 eachtran 属性,配置 batchexec、batchmultiexec类型生成的所有SQL是否一个事务中执行,默认为false,true的话则每个批次循环在不同的事务。 2018.06.15 默认参数增加直接设置值类型,DT_VALUE,格式{value} ,示例:{""},{0} 2018.03.15 修复参数默认值未定判断处理bug default: 原 if len(strings.TrimSpace(para.Paratypestr)) > 0 { 改为 if len(strings.TrimSpace(para.Defaultstr)) > 0 {

    2017.05.28 -增加 对主从表的使用id的处理--待测试 2017.03.22 -增加两种类型的sql,处理二进制对象保存到数据库和从数据库获取: ST_GETBLOB //10 获取BLOB (binary large object),二进制大对象从数据库 ST_SETBLOB //11 保存BLOB (binary large object),二进制大对象到数据库

    动态SQL路由注册 特别说明:将router定义代码放到 sysrouter.go中

    功能:动态SQL执行函数供其他包调用单元 日期: 更新: 2017.06.05 增加 SelectMapIsExist 2017.03.29 增加几个函数,返回Rows 2017.03.13 增加默认参数处理 2016.10.18 增加 PagingSelectMapToMap func

    功能:监控配置目录下的文件变化自动载入(修改,删除--OK) 作者:畅雨 日期:2016.06.01 已知问题: 1) 文件改名检测到但无法获知改名后文件故未更新----->可以用ReloadAll重新载入即可 更新记录:

Index

Constants

View Source
const (
	Int   string = "^(?:[-+]?(?:0|[1-9][0-9]*))$"
	Float string = "^(?:[-+]?(?:[0-9]+))?(?:\\.[0-9]*)?(?:[eE][\\+\\-]?(?:[0-9]+))?$"
	Email string = "" /* 1212-byte string literal not displayed */
)

类型判断正则表达式定义

View Source
const MSCONFIGFILE = "./config/directsql.ini"

配置文件配置参数

Variables

This section is empty.

Functions

func BacthExecMap

func BacthExecMap(modelId, sqlId string, sp []map[string]interface{}) error

批量执行 UPDATE、INSERT、DELETE、mp 是MAP类型命名参数

func BacthMultiExecMap

func BacthMultiExecMap(modelId, sqlId string, mp map[string][]map[string]interface{}) error

批量执行 BacthComplex、mp 是MAP类型命名参数,事务中依次执行

func CheckRequired

func CheckRequired(str string) bool

检查是否必须的

func ClearCache

func ClearCache()

清除全部缓存

func DealwithParameter

func DealwithParameter(modelId, sqlId string, mp map[string]interface{}, sqlindex int, ctx *faygo.Context) error

默认参数处理

func DirectSQL

func DirectSQL() faygo.HandlerFunc

DirectSQL handler 定义

func DirectSQLReloadAll

func DirectSQLReloadAll() faygo.HandlerFunc

重新载入全部ModelSql配置文件

func DirectSQLReloadModel

func DirectSQLReloadModel() faygo.HandlerFunc

重新载入单个ModelSql配置文件

func ExecMap

func ExecMap(modelId, sqlId string, mp map[string]interface{}) (sql.Result, error)

执行EXEC (UPDATE、DELETE、INSERT),mp 是MAP类型命名参数 返回结果 sql.Result

func ExecStruct

func ExecStruct(modelId, sqlId string, st interface{}) (sql.Result, error)

执行EXEC (UPDATE、DELETE、INSERT),SQL参数是struct 返回结果 sql.Result

func GetCache

func GetCache(key string, suffix string) (ok bool, result []byte)

根据key以及suffix后缀获取缓存的结果 has 表示存在有效的result,result为结果

func IsEmail

func IsEmail(str string) bool

字符串是否合法Email地址

func IsFloat

func IsFloat(str interface{}) bool

字符串是否浮点数

func IsInt

func IsInt(str interface{}) bool

字符串是否整数,空也是合法的.

func IsVaildDate

func IsVaildDate(str string) bool

给定的字符串是否合法的日期(YYYY-MM-DD)

func IsVaildDatetime

func IsVaildDatetime(str string) bool

给定的字符串是否合法的日期时间

func IsVaildLength

func IsVaildLength(str string, min, max int) bool

字符串是否有效的长度

func IsVaildValue

func IsVaildValue(value, min, max float64) bool

给定的数值是否在范围内

func JSONString

func JSONString(v interface{}, Indent bool) (string, error)

转换 interface{} 到 JSON

func Map2Struct

func Map2Struct(mp map[string]interface{}, st interface{}) error

map值转化到struct中

func MultiSelectMapToMap

func MultiSelectMapToMap(modelId, sqlId string, mp map[string]interface{}) (map[string][]map[string]interface{}, error)

多個查询 返回 map[string][]map[string]interface{}

func MultiSelectMapToRows

func MultiSelectMapToRows(modelId, sqlId string, mp map[string]interface{}) (map[string]*core.Rows, error)

执行返回多個結果集的多個查询根据modelId,sqlId ,SQLmp:map[string]interface{}命名参数 返回结果 map[string]*Rows

func RegAny

func RegAny(name string, fn interface{}) (err error)

注册新的变量或函数到map

func ReloadAll

func ReloadAll()

重置配置文件全部重新载入,API:/bom/reload handle调用

func ReloadModel

func ReloadModel(msqlfile string) error

重新载入单个模型文件---未测试!!!

func RemoveCache

func RemoveCache(key string)

清除key的缓存

func SelectMapIsExist added in v1.3.0

func SelectMapIsExist(modelId, sqlId string, mp map[string]interface{}) (bool, error)

func SelectMapToMap

func SelectMapToMap(modelId, sqlId string, mp map[string]interface{}) ([]map[string]interface{}, error)

查询 根据modelId,sqlId ,SQL参数 map 返回 []map[string]interface{}

func SelectMapToRows

func SelectMapToRows(modelId, sqlId string, mp map[string]interface{}) (*core.Rows, error)

查询 根据modelId,sqlId ,mp:map[string]interface{}命名参数,返回*core.Rows

func SelectMapToStruct

func SelectMapToStruct(modelId, sqlId string, mp map[string]interface{}, st interface{}) (*[]interface{}, error)

查询 根据modelId,sqlId ,SQL参数是map, 返回 []struct 目前使用比较繁琐:st --是结构体的一个空实例,返回的是 改结构体的实例的slice,再使用返还结果时还的需要转换下类型。

func SelectMapToStructPro

func SelectMapToStructPro(modelId, sqlId string, mp map[string]interface{}, dest interface{}) error

查询 根据modelId,sqlId ,SQL参数是map,dest 是待填充的返回结果 []*Struct ---未完成

func SetCache

func SetCache(key string, suffix string, value []byte, timeout int)

将key以及suffix后缀的值放入到缓存中,如果存在则替换,并记录失效日期

func SplitRight

func SplitRight(s string, c byte) (left, right string)

将s 根据从右边第一个出现的c进行分割成两个stirng,比如 'aa / bb / cc' -> 'aa / bb','cc'

func Struct2Map

func Struct2Map(st interface{}) map[string]interface{}

Struct2Map

Types

type Execresult

type Execresult struct {
	LastInsertId int64  `json:"lastinsertdd"`
	RowsAffected int64  `json:"rowsaffected"`
	Info         string `json:"info"`
}

execMap的返回结果定义

type MemoPool

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

缓存池对象

type PagingSelectResult

type PagingSelectResult struct {
	Total int                      `json:"total"`
	Data  []map[string]interface{} `json:"data"`
}

分頁查詢的返回結果

func PagingSelectMapToMap

func PagingSelectMapToMap(modelId, sqlId string, mp map[string]interface{}) (*PagingSelectResult, error)

执行分页查询SQL mp 是MAP类型命名参数 返回结果 int,[]map[string][]interface{}

type PagingSelectRows

type PagingSelectRows struct {
	Total int `json:"total"`
	Rows  *core.Rows
}

分頁查詢的返回結果

func PagingSelectMapToRows

func PagingSelectMapToRows(modelId, sqlId string, mp map[string]interface{}) (*PagingSelectRows, error)

执行分页查询SQL mp 是MAP类型命名参数 返回结果 int,Rows

type TCmd

type TCmd struct {
	XMLName    xml.Name         `xml:"cmd"`
	Pin        string           `xml:"in,attr"`   // 输入参数标示
	Rout       string           `xml:"out,attr"`  // 输出结果标示
	Sql        string           `xml:",chardata"` // SQL
	Parameters []*TSqlParameter `xml:"parameters>parameter"`
}

TCmd <Select/>等节点的下级节点<sql />对应结构

type TDefaultType

type TDefaultType int

---------------------------------------------------------------------------------------------------- 默认值类型:uuid/nowdate/now/nowunix

const (
	DT_UNDEFINED   TDefaultType = iota // 0=未定义,不处理默认值
	DT_UUID                            // uuid
	DT_INT64UUID                       // 64位整数长度的唯一id (具体说明见 readme)
	DT_SHORTUUID                       // 短字符串的唯一id(将int64uuid转为36进制的值(10个数字+26个字母组成的))
	DT_NOWDATE                         // 当前日期 now date
	DT_NOWDATETIME                     // 当前日期时间 now datetime
	DT_NOW_UNIX                        // 当前时间的unix值 int64 now date
	DT_CUSTOM                          // 自定义变量,采用注册自定义函数获取变量实现
	DT_PARENTID                        // 关联的主表的Id的值
	DT_VALUE                           // 直接设置默认值,比如字符串设置{""},数值设置 {0} 用大括号括起来
)

type TModel

type TModel struct {
	Id   string           // root起用映射、不带扩展名的文件名
	DB   *core.DB         // 本模块的db引擎 *xorm.Engine.DB()
	Sqls map[string]*TSql // sqlentity key=sqlentity.id
}

sqlmodel 一个配置文件的SQLModel对应的结构

type TModels

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

全部业务SQL路由表,不根据目录分层次,直接放在map sqlmodels中,key=带路径不带扩展名的文件名

func (*TModels) StartWatcher

func (mss *TModels) StartWatcher() error

start filesytem watcher

func (*TModels) StopWatcher

func (mss *TModels) StopWatcher() error

stop filesytem watcher

type TParaType

type TParaType int

参数类型:string/number/email/date/datetime/time

const (
	PT_STRING   TParaType = iota // 0=字符串,默认就是按照字符串处理
	PT_INT                       // 1=整数数值
	PT_FLOAT                     // 2=浮点数
	PT_DATE                      // 3=日期
	PT_DATETIME                  // 4=日期时间
	PT_EMAIL                     // 5=电子邮件
	PT_BLOB                      // 6=二进制
)

type TSql

type TSql struct {
	XMLName    xml.Name `xml:"sql"`
	Id         string   `xml:"id,attr"` // sqlid
	Sqltypestr string   `xml:"type,attr"`
	Sqltype    TSqltype `xml:"-"`              // SQL类型
	Idfield    string   `xml:"idfield,attr"`   // SQlType为6=嵌套jsoin树时的ID字段
	Pidfield   string   `xml:"pidfield,attr"`  // SQlType为6=嵌套jsoin树时的ParentID字段
	Cmds       []*TCmd  `xml:"cmd"`            // sqlcmd(sqltype为分页查询时的计数SQL放第一个,结果SQL放第二个)
	Cached     bool     `xml:"cached,attr"`    // 是否启用查询数据缓存功能
	Cachetime  int      `xml:"cachetime,attr"` // 默认缓存的时间,单位为分钟,-1为一直有效,-2为一月,-3为一周 -4为一天,单位为分钟
	Eachtran   bool     `xml:"eachtran,attr"`  // 对于 batchexec、batchmultiexec类型SQL 如果为 false则所有SQL在一个事务执行,true则每一个批次在一个事务中

}

sql <Select/>等节点对应的结构

type TSqlParameter

type TSqlParameter struct {
	Name        string       `xml:"name,attr"`     // 参数名称必须与cmd中的对应
	Paratypestr string       `xml:"type,attr"`     // string/number/email/date/datetime/time  -不定义则不需要验证
	Paratype    TParaType    `-`                   // 数值类型
	Required    bool         `xml:"required,attr"` // 0=不是必须的   1=必须的不能为空
	Minlen      int          `xml:"minlen,attr"`   // 最小长度
	Maxlen      int          `xml:"maxlen,attr"`   // 最大长度
	MinValue    float64      `xml:"minvalue,attr"` // 最小值
	MaxValue    float64      `xml:"maxvalue,attr"` // 最大值
	Defaultstr  string       `xml:"default,attr"`  // 默认值 undefined/uuid/userid/usercode/username/rootgroupid/rootgroupname/groupid/groupname/nowdate/nowtime
	Default     TDefaultType `-`                   // 数值类型
	Return      bool         `xml:"return,attr"`   // 服务端生成的默认值是否返回到客户端: 0(false)=默认,不返回   1(true)=返回到客户端
	Parentid    bool         `xml:"parentid,attr"` // 是否作为从表的关联本表(主表)的id的值
}

TSqlParameter 参数校验定义

type TSqltype

type TSqltype int

TSql 类型

const (
	ST_SELECT         TSqltype = iota // 0 普通查询 ---OK!
	ST_PAGINGSELECT                   // 1 分页查询 ---OK!
	ST_NESTEDSELECT                   // 2 嵌套jsoin树---------未实现
	ST_MULTISELECT                    // 3 多结果集查询---OK!
	ST_EXEC                           // 4 执行SQL,可以一个事务内批量执行多个cmd
	ST_BATCHEXEC                      // 5 根据传入参数在一个事务内多次执行SQL
	ST_BATCHMULTIEXEC                 // 6 批量执行复合SQL(多数据集批量插入、更新、删除)---OK!
	ST_IMPORT                         // 7 导入数据的SQL:通过xlsx导入数据配置的SQL
	ST_EXPORT                         // 8 导出数据的SQL:导出excel格式文件数据
	ST_REPORT                         // 9 报表用的SQL:通过xlsx模板创建报表的SQL
	ST_GETBLOB                        // 10 获取BLOB (binary large object),二进制大对象从数据库
	ST_SETBLOB                        // 11 保存BLOB (binary large object),二进制大对象到数据库
)

func GetSqlType

func GetSqlType(modelid string, sqlid string) TSqltype

type Worker added in v1.3.0

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

定义一个woker工作节点所需要的基本参数

func UUIDService added in v1.3.0

func UUIDService() *Worker

UUIDService 获取uuid的入口函数

func (*Worker) GetInt64Id added in v1.3.0

func (w *Worker) GetInt64Id() int64

生成方法一定要挂载在某个woker下,这样逻辑会比较清晰 指定某个节点生成id

func (*Worker) GetShortStrId added in v1.3.0

func (w *Worker) GetShortStrId() string

Jump to

Keyboard shortcuts

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