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

10

我一直喜欢Clojure core.logic,但我遇到了一个困境。我需要让它使用数据库,可以是SQL或非SQL,而不是内存数据结构。当我四处寻找时,我看到提到了to-stream函数,但没有实际的使用示例。

有人有使用core.logic和数据库的好例子吗?


1
在 core.logic 文档中有一个将其连接到 Dataomic 的示例 - 你看过那个了吗?https://github.com/clojure/core.logic/wiki/Extending-core.logic-%28Datomic-example%29 - brool
我看到了这个问题,我认为问题是我不使用Datomic,所以我不太明白Custom Data Sources示例实际上是做什么的。我几乎懂了,但我不知道如何例如基于它尝试统一的数据运行查询。 - M Smith
1个回答

8

正如评论中已经有人建议的那样,请查看core.logic repository中的Datomic示例。基于该示例,您可以想象编写类似以下内容的东西:

(defn query [db query-string out]
  (fn [a]
    (to-stream
      (map (fn [result] (unify a out result))
        (db-query db query-string)))))

所有的core.logic目标都只返回闭包,这些闭包接受一个替换映射a(当然,您可以将其称为任何您喜欢的名称)。基本上,您需要在结果上进行映射,并将它们与a中的out统一。
那么,您可以想象编写如下的core.logic程序:
(run* [q]
  (fresh [row]
    (query some-db "... some query string ..." row)
    (some-other-goal row q)))

谢谢,这确实让它更清晰了。基于其他目标的结果构建查询字符串是有意义的吗? - M Smith
这是可能的,但当然需要更多的工作,具体取决于您想要支持什么。 - dnolen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接