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

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

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}

  • 思源笔记

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

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

    21404 引用 • 84452 回帖
  • 分享

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

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

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • 其他回帖
  • 你好,想问一下,range 方法是怎么使用的, 比如:”foo,bar,baz“,以逗号分割的数量。

    range 方法一直没法成功运行。

    
    .action{$a := split "," "foo$bar$baz"}
    .action{$ok := 0}
    .action{range $index, $value := $a}
        .action{$ok := $ok+1}
    .aciton{end}
    
    1 回复
  • Kurigohan 1 评论

    您好,想请教一下:

    哪里能看到数据库中所有支持的语法与函数文档?

    目前支持选择同个数据库中其他行的数据吗,比如做个账本,用上一行的余额和这一行的金额计算得到这一行的余额并准备给下一行调用。这个功能在同类笔记软件中均无法实现(至少我没找到合适的模板)

    非常感谢解答!

    1 回复
    目前还没找到可以选择其他行的函数
    lovelife88
  • 为什么不搞个公式列呢?这叫普通的用户如何入门?

    1 回复
  • 查看全部回帖