Obs135|解鎖簡易Dataview查詢:驚人的SQL技巧,使用Query All The Things(QATT)外掛

Dataview可以很方便的透過Obsidian的Metadata來蒐集筆記資訊,雖然Dataview的查詢語法不複雜,但輸出格式固定,需要較不同的輸出樣式時就必須透過稍複雜的Dataviewjs,以JavaScript來撰寫。Query All The Things (以下簡稱qatt) 外掛則嘗試填平簡單語法+自訂輸出格式之間的差距。

Qatt以類SQL語法當做查詢語言,以Handlebars當做輸出模板引擎,要活用Qatt就必須學習它的SQL語法與Handlebars模板語言。

1. 撰寫第一個qatt程式碼區塊

和Dataview一樣,qatt也是透過程式碼區塊來動態執行的,程式碼區塊的語言指定為==qatt==,以YAML語法提供querytemplate兩個欄位:

query: |
  SELECT TOP 5 *, moment(stat->ctime)->format("YYYY-MM-DD") ctime
  FROM obsidian_markdown_notes
  WHERE 'obsidian' in tags
  ORDER BY stat->ctime DESC
template: |
      {{#each result}}
        - {{ctime}} [[{{path}}\|{{basename}}]]
      {{/each}}

執行結果:

gh

  • YAML語法裡的 | 指定關鍵欄位的內容是區塊
  • 區塊內不要用 4 個空白開頭,以免被渲染成區塊

1.1. query重點

  • select ... from ... order by ... 是標準的SQL語法
  • obsidian_markdown_files 是Obsidian系統裡的所有筆記檔案
  • SQL標準的 . 在Qatt裡要改用 ->

1.2. template重點

  • 查詢後的結果用{{#each result}}{{/each}}裡的樣式輸出
  • 輸出欄位用兩個大括號夾住,如:{{basename}}

1.3. Another sample

query: |
  SELECT TOP 10 
  basename, path, moment(stat->mtime).format() as LastModified
  from obsidian_markdown_notes
  where moment(stat->mtime)->isAfter(moment().startOf('month'))
template: |
  | Name | Path | Last Modified |
  | --- | --- | ---|
  {{#each result}}
  | {{basename}} | {{path}} | {{LastModified}} |
  {{/each}}

2. 資料表

3. HTML輸出範例

3.1. 資料表:dataview_pages

postRenderFormat: html
query: |
  SELECT top 5 tags, file->name name, file->path path, file->link->path link, created
  FROM dataview_pages
  WHERE 'obsidian' in tags and file->path not like '%template%'
  ORDER BY file->ctime DESC
template: |
  <table>
  <tr><th>建檔日期</th><th>檔名</th><th>標籤</th></tr>
  {{#each result}} 
  <tr><td>{{created}}</td><td> <a href="{{link}}" target="_blank" class="internal-link" >{{name}}</a> </td><td> {{tags}} </td></tr>
  {{/each}}
  </table>

gh

3.2. 資料表: obsidian_markdown_notes

query: |
  SELECT top 5 REPLACE(CAST(tags as varchar),',', ' ') tags, basename, 
  makeMarkdownLink(basename, path) AS mdLink,
    REPLACE(path, ' ', '%20') path, 
    moment(stat->ctime).format("YYYY-MM-DD hh:mm") created
  FROM obsidian_markdown_notes
  WHERE 'obsidian' in tags and path not like '%template%'
  ORDER BY stat->ctime DESC
template: |
  | Created on | File name | Tags |
  |--|--|--|
  {{#each result}} 
  |{{created}}| [{{basename}}]({{path}}) | {{tags}}|
  {{/each}}

gh

[!WARNING]+ 注意!
資料表obsidian_markdown_notes與dataview_pages裡欄位不同,小心使用

4. 相關鏈接

5. 教學影片

##

您可能也會有興趣的類似文章

您可能也會喜歡…

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *