【问题标题】:Clojure database interaction - application design/approachClojure 数据库交互 - 应用程序设计/方法
【发布时间】:2011-11-11 08:30:40
【问题描述】:

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

我目前正在开发一个与 SQLite 数据库对话的基本应用程序,因此我自然而然地使用 clojure.java.jdbc 库 (link) 与数据库进行交互。

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

我关心的是如何在更广泛的应用程序环境中使其更加健壮?我的意思是当我将数据写入数据库并检索它时,我想在应用程序中的任何地方使用相同的格式化地图,所以从数据访问层(返回或传入地图)一直到应用程序处理数据并再次向下传递的层。

我想要了解的是,是否存在与 JavaBeans 等效的“惯用”clojure?

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

【问题讨论】:

    标签: database clojure


    【解决方案1】:

    据我所知,真的没有这样的图书馆。有多种系统可以更轻松地编写查询,但 AFAIK 无法“修复”您的数据对象。

    我一直在尝试写一些你自己提议的东西,但我放弃了这个项目,因为很快就很明显,这在 clojure 系统中根本不是正确的事情(实际上,我倾向于现在想想,即使在具有真正“固定”数据结构的语言中,这种方法也只有非常有限的用途)。

    clojure 收集系统的问题:

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

    一般概念问题:

    • 您假设您可以“在任何地方使用相同的格式化地图 在应用程序中,因此从数据访问层(返回或 传入地图)一直到应用程序层 处理数据并将其再次向下传递” 如果您的 系统甚至有点复杂。 最好,您可以使用地图 在一些简单的情况下,数据库到 UI,但反过来是 几乎总是错误的方法。

    • 几乎每个查询都会有自己的结果行“类型”;你是 可能无法跨查询重用这些“类型” 甚至在相关代码中。

    • 另外,在程序的其余部分强制使用这些类型可能是 将您的应用程序更多严格绑定到数据库架构。如果你的 业务逻辑功能健全且编写良好,它们应该只 访问尽可能多的数据,仅此而已;他们可能应该 不要到处使用相同的数据格式。

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

    【讨论】:

    • 很好的回复,谢谢!所以建议是保留特定于数据库层的模式特定的东西,并且应该对它接收到的任何数据进行任何转换?应用程序的其余部分应避免耦合到数据库?
    【解决方案2】:

    Clojure 支持Few data structure and lots of functions to work on these few data structures 的概念。很少有方法可以创建新的数据结构(我猜内部使用基本数据结构),如 defrecord 等。但是,如果您能够使用它们,那并不能真正解决 DB 架构更改应该影响的问题代码更少,因为您最终将不得不通过层来删除/添加架构更改的效果,因为您正在读取/创建需要更改的数据的任何地方

    【讨论】:

      猜你喜欢
      • 2012-04-12
      • 2020-08-16
      • 1970-01-01
      • 2013-11-06
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多