如何将clojure core.logic连接到数据库?

M S*_*ith 9 clojure clojure-core.logic

我一直很享受Clojure core.logic,但我遇到了一堵墙.我需要能够使用数据库,无论是否使用SQL,而不是内存数据结构.当我环顾四周时,我看到了一个to-stream功能的提及,但没有使用它的实例.

有没有人有一个将core.logic与数据库一起使用的好例子?

dno*_*len 5

正如有人在评论中已经建议的那样,请查看core.logic存储库中的Datomic示例.基于这个例子你可以想象写这样的东西:

(defn query [db query-string out]
  (fn [a]
    (to-stream
      (map (fn [result] (unify a out result))
        (db-query db query-string)))))
Run Code Online (Sandbox Code Playgroud)

所有core.logic目标都只返回带有替换映射的闭包a(你当然可以随意调用它).从本质上讲,你需要在映射的结果,并与它们统一outa.

然后你可以想象编写一个core.logic程序,如下所示:

(run* [q]
  (fresh [row]
    (query some-db "... some query string ..." row)
    (some-other-goal row q)))
Run Code Online (Sandbox Code Playgroud)