37

使用 Haskell 与数据库交互的最佳方式是什么?我习惯于使用某种 ORM(Django 的 ORM、hibernate 等),在使用HAppS创建应用程序时,类似的东西会很好。

编辑:就实际数据库而言,我想自由选择 Postgresql MySql 和 SQLite。

4

6 回答 6

15

我想到的库不是 ORM,但它仍然可以做你想做的事。

如果你想要一些东西可以让你的数据库访问安全,同时很好地将东西集成到你的程序中,那么试试HaskellDB。它基本上会查看您的架构,生成一些数据结构,然后为您提供类型安全的查询方式。它已经存在了很长一段时间,社区认为它很好且稳定。

要使用它,您需要一些底层的 Haskell DB 库,例如 HSQL。

祝你好运!

于 2008-09-19T22:48:34.580 回答
10

ORM 库存在的原因是 C# 或 Java 中的对象与您存储在数据库中的对象之间存在相对较大的差异。这在 Haskell 中不是什么大问题,因为:

  1. 它没有对象
  2. 数据库和 Haskell 列表都受到数学集合论的启发,因此它们之间的摩擦比数据库和对象之间的摩擦要小得多。
于 2008-11-15T22:52:56.103 回答
10

Persistent 使用起来相当不错,它可以让您依靠类型推断来确定您的查询所涉及的表。例如,如果我的“模型”文件中有以下内容:

User
    name Text
    age Int

Login
    user UserId
    login Text
    passwd Text

然后我可以这样做:

Just (Entity uid _)          <- selectFirst [ UserName ==. "exampleUser" ] []
Just (Entity lid Login {..}) <- selectFirst [ LoginUser ==. uid ] []

它会知道我指的是哪些表。当然,您可能不想编写这样的部分代码,但我只想强调查询。

于 2013-05-28T22:26:09.910 回答
3

我个人只使用了“Real World Haskell”推荐的 Database.HDBC :http: //book.realworldhaskell.org/read/using-databases.html

但我同意使用更高级别的数据库访问层绝对是有意义的,我可能会尝试在未来的项目中使用这种模型。关于这个主题,我发现了 2012 年的这篇文章,它提供了 Haskell 此类解决方案的历史和比较: http ://www.yesodweb.com/blog/2012/03/history-of-persistence

从中,我收集到 Persistent(文档)和 Groundhog(一些文档示例)是该领域最有前途的库。这两个库都支持您提到的数据库;对于土拨鼠,它没有写在这篇文章中,但在这个公告中你可以看到它完全支持你感兴趣的数据库。

还要注意Haskell-beginners 上的这个线程,其中提到Esqueletto是更新操作的更好选择。

请注意,持久性与 Yesod 一起提供,因此可能有更多的追随者。

于 2013-05-28T19:26:14.377 回答
2

实际上,我非常喜欢 HAppS ( HAppS-State ) 的方法,它可以让你忘记经历 ORM 的编组/解编组,让你简单地使用 Haskell 的数据类型。

于 2008-11-02T06:36:37.770 回答
1

您是否查看了 http://hackage.haskell.org/packages/archive/pkg-list.html#cat:Database上的数据库映射和访问包

我没有使用过它们,所以不能推荐任何特定的。我也不知道你打算使用什么数据库。

于 2008-09-19T21:13:05.230 回答