【发布时间】:2011-09-08 17:09:39
【问题描述】:
我正在阅读有关 clojure 网络堆栈的网站:
http://brehaut.net/blog/2011/ring_introduction
关于 clojure 的 ORM 有这样的说法:
“由于显而易见的原因,没有用于 Clojure 的 SQL/关系数据库 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)))
有没有办法让这个概念自动化,或者这是否尽可能好?
【问题讨论】:
-
许个愿:你想如何更简洁地编码/声明/写这个?
-
我对“显而易见的原因”的看法是,对象关系映射在非面向对象的语言中没有意义。
-
@Kevin:如果你想要修补和精细控制,你需要 SQL,而不是 ORM,因为 ORM 使最简单的事情变得微不足道,但复杂的事情变得不可能或过于复杂。
-
@ivant:ORM 不是一个好名字,但这个概念对于非面向对象的语言仍然有效。在 Clojure 中,您可以将关系映射到映射或类型/记录。后者在将继承放在一边时与对象完全同构。
-
Marko Kocić,您的陈述可能与琐碎或糟糕的 ORM 有关。 ORM 是个好东西。它使代码更干净,更可重用。 Rails 的带有新 ARel 功能的 Active Records 允许您使用原始 sql 完成 97% 的操作。我不得不用 PostgreSQL 做一些相当复杂的事情,而 ARel 完全可以做到这一点,而无需退回到原始 SQL。