为 twidget 增加后端数据库

字数: 446 · ...

最近写了一个文本控件库 twidget,今天尝试用这个库在emacs中实现一个简单的笔记本应用,但我发现这种涉及大量文本数据且结构固定的应用更适合存储在数据库了。Twidget 虽然可以实现复杂多样的前端交互,但没有后端就像纸老虎。如果可以和数据库结合起来,便如虎添翼。于是便实现了 twidget-db 这个宏。

twidget-dbemacsqlemacsql-sqlite3 的使用做了一个封装。用户通过几行代码就可以建立数据库并进行增删改查操作。使用该宏后,可以得到两个函数 <prefix>-db<prefix>-db-action 。<prefix> 指 :prefix 属性的值。具体使用参考下面的例子。

(twidget-db "~/.emacs.d/notebook/notebook.db"
  :prefix "test"
  :tables '((notes [title content album timestamp])))

(test-db-action
 [:insert :into notes :values
          (["title" "content of note" "default" "2021-05-10"]
           ["title2" "content of note2" "default" "2021-05-11"])])
(test-db-action [:select [title content] :from notes])
;; => (("title" "content of note") ("title2" "content of note2"))

(test-db-action [:update notes :set [(= album "Emacs")
                                     (= content "new content of note")]
                         :where (= title "title2")])
(test-db-action [:select * :from notes])
;; => (("title" "content of note" "default" "2021-05-10") ("title2" "new content of note" "Emacs" "2021-05-11"))

(test-db-action [:delete :from notes])
(test-db-action [:select * :from notes])
;; => nil

上面的代码的意思是:在 ~/.emacs.d/notebook/notebook.db 文件中创建了数据库,并根据 :tables 参数的值生成了 notes 表。定义了 test-dbtest-db-action 两个函数。

test-db 返回一个数据库连接,可以被 emacsql 的函数使用,如 (emacsql (test-db) <sql>)test-db-action 做了进一步的封装,参数只有一个sql语句。Emacsql 的sql语句的写法请查看 emacsql文档

除了在 twidget 中使用,twidget-db 的代码也可以单独用于需要数据库的插件中。代码在 Github 自取。

发布于 2021-05-11