我正在阅读这个关于clojure web堆栈的网站:
http://brehaut.net/blog/2011/ring_introduction
对于clojure,它有关于ORM的说法:
"出于显而易见的原因,Clojure没有SQL/Relational DB ORM."
我可以看到的显而易见的原因是,当您执行clojure.contrib.sql或clojureql查询时,将自动映射到对象.然而,似乎需要一些额外的工作来做一对多或多对多的关系(尽管可能没有太多的工作).
我发现这写了一对多:http://briancarper.net/blog/493/
我不确定我同意哪个; 它似乎假设从数据库中提取了两个表,然后在内存中过滤了连接表.在实践中我认为sql查询将指定where条件.
所以我想知道,是否有一些相当明显的方法可以通过clojureql或clojure.contrib.sql自动执行一对多关系?我唯一能想到的是这样的事情(使用典型的博客文章/评论示例):
(defn post [id]
@(-> (table :posts)
(select (where :id id))))
(defn comments [post_id]
@(-> (table :comments)
(select (where :post_id post_id))))
(defn post-and-comments [id]
(assoc (post id) :comments (comments id)))
Run Code Online (Sandbox Code Playgroud)
有没有什么方法可以自动化这个概念,还是这样做得好?
看起来每个人都涵盖了基本情况,例如选择某些列并通过谓词过滤得很好,但我想知道每种情况如何比较更高级的情况.是否更容易在一个方面表达复杂的查询?一个库是否缺少对方涵盖的任何功能?
只是想了解clojureql的开放全局和结果的目的.我首先阅读了这篇概述:ClojureQL与clojure.contrib.sql相比如何?
我认为由于某种原因open-global将取代sql/with-connection,例如我认为这样可行:
(def db {...}) ; connection details omitted
(open-global db)
(println (:name (first @(table :users)))
Run Code Online (Sandbox Code Playgroud)
但这不起作用.看来我需要做开放全局并将执行查询包装在(sql/with-connection数据库)中,这让我感到惊讶(我认为open-global提供了一个默认的全局可访问连接).所以,既然情况似乎并非如此,我现在就想知道它到底是做什么的.
另外......结果与简单地用@执行查询有什么不同?因为似乎@(table:users)会给我一个序列,这个序列是执行查询的结果(不是那个with-results也是如此)?
我如何使用clojureql在两个日期之间进行选择?希望这样的事情:
@(-> (table :abc)
(select (where (between d1 d2))))
Run Code Online (Sandbox Code Playgroud)