SQL模板

  • 从2.7版开始,ESAP引入了sqlt库github.com/it512/sqlt作为sql操作的中间件。

  • 同时,村长在ESAP内部实现了许多自定义函数,使用ESAP的模板功能,你可以快速打造基于SQL的数据API。

什么是API

  • API是前后端分离后的一种后端服务,专注于提供数据访问,ESAP的API服务采用流行的json格式。

  • ESAP启动时,会自动建立/api/*,/api2/*,/es/*,/es2/*等几组API路由,APP和桌面版就是使用这些路由调用sql模板,实现数据查询和创建ES表单等功能。

查询服务

  • 我们以APP的库存查询为例子演示sql模板的查询输出功能。

  • 在APP的库存查询搜索框输入手机时,前端(APP)就会向后端(ESAP)发起一个GET请求,请求地址是/api/vlbq?s=手机,然后ESAP返回数据,APP展示数据。

  • ESAP是如何获取数据的呢?实际上是搜索了sql/get/*.tpl中的vlbq模板,然后解析执行sql,返回结果集的json编码。
{ {define "vlbq"} }
    select * from vlbq where 名 like '%{ {.s} }%'
{ {end} }
  • 这个模板十分简单,有助于我们熟悉了解模板语法,首先用define定义了vlbq这个sql模板,尾部用{ {end} }结束,模板中的请求参数用双花括号包裹。

  • 模板中的{ {.s} }执行时会替换成实际的请求参数s,也就是手机,所以最终执行的sql语句是:select * from vlbq where 名 like '%手机%'

  • 我们可以在浏览器直接输入http://localhost:9090/api/vlbq?s=手机,来感受一下这个API数据的回传。

模板语法

  • sql模板使用了go语言的标准库text/template进行解析,所有的语法都与标准库兼容,包括标准模板函数。

  • 此外,sql模板还支持使用命名变量,也就是使用:s(冒号+参数)的形式,微信查询中的:pn就是这个原理,需要注意的有两点:

    • 如果字段的值内容中有冒号,那么需要用双冒号来实现转义,例如: select N'小新说::大象你的鼻子怎么这么长?' 才能输出:小新说:大象你的鼻子怎么这么长?
    • 如果参数名是中文,那么不支持命名变量,所以你不能写成这样:select :品名,而必须写成:select '{ {.品名} }'
  • 其他模板语法和函数可以百度golang 模板语法

变量与函数

  • 在sql模板里可定义变量和调用一些强大的自定函数,语法是:

    { {funcname .arg1 .arg2} }
    
  • 例如我们要产生一个新的图片picNo就可以直接这样写:

    declare @picNo nvarchar(20)
    set @picNo ='{ {newpicno} }' --会调用ES存储过程生成新图片号'P0000000x',后续语句可以直接使用@picNo
    select @picNo
    
  • 上面语句使用了sql原生变量,当然我们也可以用模板变量:

    { {$picno := newpicno} }' --后续语句可以直接使用{ {$picno} }
    select '{ {$picno} }'
    

*实用自定义函数[高级教程]

函数名称 类型 说明
and 标准 and 条件
not 标准 not 条件
or 标准 or 条件
range 标准 子项遍历
uuid ESAP 唯一机器编码,类似GUID
newrcid ESAP 调用GetNewId_s获取ES新rcid
newpicno ESAP 调用GetNewId_s获取ES新picNo
newlinkno ESAP 调用GetNewId_s获取ES新linkNo
rtid ESAP 传入模板名称获取rtid
addpic ESAP 插入指定url的图片到特定表单字段,下载图片到网盘,原型是 DownloadPic(picUrl, tableName, fieldName, rcid, picNo)
addlink ESAP 插入指定url的文件到特定表单字段,下载文件到网盘,原型是 DownloadFile(picUrl, filename, tableName, fieldName, rcid, linkNo)
int64date ESAP 将日期戳转换成日期,主要用于微信审批同步的日期处理
int64datetime ESAP 将日期戳转换成日期时间,主要用于微信审批同步的日期+时间处理
getwechatname ESAP 根据微信userid获取姓名
checktableid ESAP 检查table中某id是否存在,原型是CheckTableId(table, field, value)
linkname ESAP 使用linkno换取附件名

results matching ""

    No results matching ""