如题,我现在想实现数据库模板列显示主键所在的二级标题,我用的是这个模板 基于思源笔记的数据库使用分享 (附模板)
其中的项目列会自动获取任务所在的文档名称,我希望能继续获取任务对应的二级标题名称显示在后面
比如下图,文档名称是工作备忘,想多显示工时登记这个任务对应的二级标题工时/周报,最后模板列输出工作备忘-工时/周报,请大佬帮忙实现,感谢。
如题,我现在想实现数据库模板列显示主键所在的二级标题,我用的是这个模板 基于思源笔记的数据库使用分享 (附模板)
其中的项目列会自动获取任务所在的文档名称,我希望能继续获取任务对应的二级标题名称显示在后面
比如下图,文档名称是工作备忘,想多显示工时登记这个任务对应的二级标题工时/周报,最后模板列输出工作备忘-工时/周报,请大佬帮忙实现,感谢。
刚才看你代码,感觉你这里的主键 id 应该是块 id,不是文档 id,上面的 SQL 仅对主键 id 是文档 id 才有效
如果主键是块 id,加上模板仅支持 select * 查询
需要用下面的 SQL,分别查询标题和 h2,然后用模板函数 cat 拼接到一起
查标题还用你之前的 SQL 就行
select * from blocks where id in (select root_id from blocks where id='20250401135156-8k4wks2');
查 h2 用下面这个,通过 parent_id 递归查询
WITH RECURSIVE ancestors AS (
-- 初始查询:从已知 id 开始
SELECT
*
FROM
blocks
WHERE
id = '20250401135156-8k4wks2'
UNION ALL
-- 递归查询:通过 parent_id 向上遍历
SELECT
b.*
FROM
blocks b
INNER JOIN
ancestors a
ON
b.id = a.parent_id
)
-- 最终查询:筛选满足条件的记录
SELECT
content as h2
FROM
ancestors
WHERE
type = 'h' AND subtype = 'h2';
别忘了在模板中具体 id 值改成?号
转换为模板代码示例如下
.action{ $h2Blocks := queryBlocks `WITH RECURSIVE ancestors AS (SELECT * FROM blocks WHERE id = '?' UNION ALL SELECT b.* FROM blocks b INNER JOIN ancestors a ON b.id = a.parent_id) SELECT * FROM ancestors WHERE type = 'h' AND subtype = 'h2'` .id }
.action{ $blocks := queryBlocks "select * from blocks where id in (select root_id from blocks where id='?')" .id }
.action{ if and (not (empty $blocks)) (not (empty $h2Blocks)) }
.action{ $blockContent := (cat (first $blocks).Content "-" (first $h2Blocks).Content ) }
.action{$blockContent}
.action{ end }
模板中用 cat 函数会在 - 前后产生一个空格,如果不想要这个空格,如下解决
把
.action{ $blockContent := (cat (first $blocks).Content "-" (first $h2Blocks).Content ) }
改为
.action{ $blockContent := (list (first $blocks).Content (first $h2Blocks).Content | join "-") }
简单方式,分开查询,然后用模板拼接起来应该可以吧
select content as title from blocks where id = '20250126175945-876nap9';
select content as h2 from blocks where root_id='20250126175945-876nap9' and type = 'h' and subtype='h2';
或者合并到一条 SQL
SELECT (SELECT content FROM blocks WHERE id = '20250126175945-876nap9') AS title, (SELECT content FROM blocks WHERE root_id = '20250126175945-876nap9' AND type = 'h' AND subtype = 'h2') AS h2;
或者用 join
SELECT
b1.content AS title,
b2.content AS h2
FROM
blocks b1
LEFT JOIN
blocks b2
ON
b1.id = '20250126175945-876nap9'
AND b2.root_id = '20250126175945-876nap9'
AND b2.type = 'h'
AND b2.subtype = 'h2'
WHERE
b1.id = '20250126175945-876nap9'
LIMIT 1;
刚才看你代码,感觉你这里的主键 id 应该是块 id,不是文档 id,上面的 SQL 仅对主键 id 是文档 id 才有效
如果主键是块 id,加上模板仅支持 select * 查询
需要用下面的 SQL,分别查询标题和 h2,然后用模板函数 cat 拼接到一起
查标题还用你之前的 SQL 就行
select * from blocks where id in (select root_id from blocks where id='20250401135156-8k4wks2');
查 h2 用下面这个,通过 parent_id 递归查询
WITH RECURSIVE ancestors AS (
-- 初始查询:从已知 id 开始
SELECT
*
FROM
blocks
WHERE
id = '20250401135156-8k4wks2'
UNION ALL
-- 递归查询:通过 parent_id 向上遍历
SELECT
b.*
FROM
blocks b
INNER JOIN
ancestors a
ON
b.id = a.parent_id
)
-- 最终查询:筛选满足条件的记录
SELECT
content as h2
FROM
ancestors
WHERE
type = 'h' AND subtype = 'h2';
别忘了在模板中具体 id 值改成?号
转换为模板代码示例如下
.action{ $h2Blocks := queryBlocks `WITH RECURSIVE ancestors AS (SELECT * FROM blocks WHERE id = '?' UNION ALL SELECT b.* FROM blocks b INNER JOIN ancestors a ON b.id = a.parent_id) SELECT * FROM ancestors WHERE type = 'h' AND subtype = 'h2'` .id }
.action{ $blocks := queryBlocks "select * from blocks where id in (select root_id from blocks where id='?')" .id }
.action{ if and (not (empty $blocks)) (not (empty $h2Blocks)) }
.action{ $blockContent := (cat (first $blocks).Content "-" (first $h2Blocks).Content ) }
.action{$blockContent}
.action{ end }
模板中用 cat 函数会在 - 前后产生一个空格,如果不想要这个空格,如下解决
把
.action{ $blockContent := (cat (first $blocks).Content "-" (first $h2Blocks).Content ) }
改为
.action{ $blockContent := (list (first $blocks).Content (first $h2Blocks).Content | join "-") }
WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。
微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。
Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。
OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。
有什么新发现就分享给大家吧!
FreeMarker 是一款好用且功能强大的 Java 模版引擎。
网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。
Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。
单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。
子曰:“工欲善其事,必先利其器。”
Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。
这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!
深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。
宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”
SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
即用的 Vim-IDE。
Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。
Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。
CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。
机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。
快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。
Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。
GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。
H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。
互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。