数据库模板列简单使用指南

本贴最后更新于 338 天前,其中的信息可能已经物是人非

1.模板语法

引用其他列参数

直接使用 .列名称 就可以引用数据库其他列作为参数

.action{.列名称}

注释语法

.action{/* 这是一条注释 */}

变量声明与赋值

.action{$var := xxx}   是声明变量
.action{$var = yyy}   是给变量重新赋值
.action{$var}             是输出

流程控制-判断

支持 if 条件判断,当前支持最简单的 bool 类型和 string 类型,定义如下所示。

.action{if .condition1}
    .action{/* 操作一 */}
.action{else if .condition2}
    .action{/* 操作二 */}
.action{end}

流程控制-循环

支持 range 循环来遍历 map、slice 中的内容,语法格式如下所示。

.action{range $index, $value := .slice}
    .action{$value}
.aciton{end}

在这个 range 循环内,遍历数据通过$index 和$value。还有一种遍历方式,语法格式如下所示。

.action{range .slice}
    .action{.}
.aciton{end}

这种方式无法访问到$index 和$key 的值,需要通过{{.}}来访问对应的$value。那么在这样情况下,在循环体内,外部变量需要使用{{$.}}来访问。

{{break}}
 最里面的 {{range pipeline}} 循环提前结束,停止当前迭代并绕过所有剩余迭代。
 
{{continue}}
 最里面的 {{range pipeline}} 循环的跳过当前迭代

逻辑运算

函数语法 函数作用
.action{if not .condition} .action{end} not 非
.action{if and .condition1 .condition2} .action{end} and 与
.action{if or .condition1 .condition2} .action{end} or 或
.action{if eq .var1 .var2} .action{end} eq 等于
.action{if ne .var1 .var2} .action{end} ne 不等于
.action{if lt .var1 .var2} .action{end} lt 小于
.action{if le .var1 .var2} .action{end} le 小于等于
.action{if gt .var1 .var2} .action{end} gt 大于
.action{if ge .var1 .var2} .action{end} ge 大于等于

定义局部变量

用法 1:

{{with pipeline}} T1 {{end}}

管道的值将赋给该标签内部的“.”。(注:这里的“内部”一词是指被{{with pipeline}}…{{end}}包围起来的部分,即 T1 所在位置)

用法 2:

{{with pipeline}} T1 {{else}} T0 {{end}}

如果管道的值为空,“.”不受影响并且执行 T0,否则,将管道的值赋给“.”并且执行 T1。

说明:{{end}}标签是 if、with、range 的结束标签。

内置函数

sprig 函数

sprig 函数介绍

预定义函数

and
    函数返回它的第一个empty参数或者最后一个参数;
    就是说"and x y"等价于"if x then y else x";所有参数都会执行;
or
    返回第一个非empty参数或者最后一个参数;
    亦即"or x y"等价于"if x then x else y";所有参数都会执行;
not
    返回它的单个参数的布尔值的否定
len
    返回它的参数的整数类型长度
index
    执行结果为第一个参数以剩下的参数为索引/键指向的值;
    如"index x 1 2 3"返回x[1][2][3]的值;每个被索引的主体必须是数组、切片或者字典。
print
    即fmt.Sprint
printf
    即fmt.Sprintf
println
    即fmt.Sprintln

比较函数

布尔函数会将任何类型的零值视为假,其余视为真。

下面是定义为函数的二元比较运算的集合:

    eq      如果arg1 == arg2则返回真
    ne      如果arg1 != arg2则返回真
    lt      如果arg1 < arg2则返回真
    le      如果arg1 <= arg2则返回真
    gt      如果arg1 > arg2则返回真
    ge      如果arg1 >= arg2则返回真

为了简化多参数相等检测,eq(只有 eq)可以接受 2 个或更多个参数,它会将第一个参数和其余参数依次比较,返回下式的结果:

    {{eq arg1 arg2 arg3}}

比较函数只适用于基本类型(或重定义的基本类型,如”type Celsius float32”)。但是,整数和浮点数不能互相比较。

管道

管道是链接起来的参数、函数或者方法序列,和 Unix 管道一样:

.action{p1 | p2 | p3}

管道允许我们将上一个输出作为参数传递到下一个指令(放在最后),不同元素之间通过 | 分隔。

示例,下面代码相当于 c/(a+b)

.action{.a | addf .b | divf .c}

2.示例

一些简单案例

.action{div (len .星级) 3}

.action{typeOf .最后联系日期}

.action{.最后联系日期 | toDate "2006-01-02" | typeOf}

.action{$lastday := .最后联系日期 | toDate "2006-01-02"}

获取 最后联系日期今天 的天数(整数)

.action{div (now.Sub .最后联系日期).Hours 24}

获取 最后联系日期今天 的天数(小数)

.action{divf (now.Sub .最后联系日期).Hours 24}

获取自定义属性 attr1 的值

参见官方案例

.action{ index ."custom-attr1" }

使用 if 判断

.action{$days := 0}
.action{if empty .最后联系日期}
    .action{$baseDate :=  toDate "2006-01-02" "2023-01-01"}
    .action{$days = divf (now.Sub $baseDate).Hours 24}
.action{else}
    .action{$days = divf (now.Sub .最后联系日期).Hours 24}
.action{end}
.action{$days}

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    22351 引用 • 89427 回帖 • 1 关注
  • 分享

    有什么新发现就分享给大家吧!

    248 引用 • 1792 回帖 • 1 关注
  • 经验
    25 引用 • 157 回帖
1 操作
lovelife88 在 2023-12-20 11:56:08 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...