Clojure数据库交互-应用程序设计/方法



我希望这个问题不是太笼统或没有意义。

我目前正在开发一个与SQLite数据库对话的基本应用程序,所以我很自然地使用clojure.java.jdbc库(链接)与DB交互。

问题是,据我所知,使用这个库将数据插入DB的方式是通过简单地传递一个映射(例如{:id 1 :name "stackoverflow"})和一个表名(例如:website)

我关心的是如何在我的应用程序的更广泛的上下文中使它更健壮?我的意思是,当我将数据写入数据库并检索它时,我希望在应用程序中到处使用相同格式的地图,因此,从数据访问层(返回或传递地图)一直到应用程序层,它处理数据并再次将其传递回去。

我想知道的是,是否有一个"惯用的"clojure等同于JavaBeans?

我现在遇到的问题是必须通过手动定义具有列名等的映射来重复自己-但是如果我在DB中更改表的结构,我的整个应用程序必须更改。

据我所知,真的没有这样的库。有各种各样的系统可以使编写查询变得更容易,但毫无疑问,没有任何东西可以"修复"你的数据对象。

我试着写一些像你建议的东西,但是我放弃了这个项目,因为它很快就变得非常明显,这在clojure系统中根本不是正确的事情(实际上,我现在倾向于认为这种方法只有非常有限的用途,即使在真正"固定"数据结构的语言中)。

clojure收集系统的问题:

  • 所有的地图访问/更改功能都非常实用。那意味着对映射的更改总是返回一个新对象,所以它是几乎不可能创建一个强制固定的映射类型易于在习惯clojure中使用。

一般概念问题:

  • 你的假设,你可以"使用相同格式的地图无处不在在应用程序中,因此从数据访问层(返回或传递映射)一直到应用层,在那里它对数据进行处理并再次将其传递回去"是错误的,如果您的系统甚至有点复杂。在最好的,您可以使用来自的映射在一些简单的情况下,从DB到UI,但反过来是

  • 几乎每个查询都有自己的结果行"type";你可能无法跨查询重用这些"类型"

  • 同样,在程序的其余部分强制使用这些类型可能是错误的将应用程序更多严格绑定到DB模式。如果你的业务逻辑函数是合理且编写良好的,它们应该获取他们所需要的尽可能多的数据;他们应该这样做不要在所有地方使用相同的数据格式

我严肃的回答是;不用麻烦了。为您想要运行的查询类型编写数据库访问函数,并让这些函数尽可能详细地检查进出数据库的值。不要试图在应用程序的其余部分强制保持来自DB的数据"相同"。如果您想在应用程序的其余部分检查数据格式,请使用断言和前置/后置条件。

Clojure偏爱Few data structure and lots of functions to work on these few data structures的概念。有几种方法可以创建新的数据结构(我猜在内部使用基本的数据结构),如defrecord等。但是,如果你能够使用它们,这并不能真正解决DB模式更改对代码的影响应该小于的问题,因为你最终必须通过层来删除/添加模式更改的影响,因为无论你在哪里读取/创建需要更改的数据

最新更新