使用Haskell与数据库交互的最佳方式是什么?我习惯于使用某种ORM(Django的ORM,Hibernate等),当使用HAppS创建应用程序时,类似的东西会很好。
**编辑:**我想自由地选择从PostgreSQL MySQL和SQLite至于实际的数据库去。
uujelgoq1#
我心目中的库不是一个ORM,但它仍然可以做你想要的。如果你想让你的数据库访问安全,同时把东西很好地集成到你的程序中,那么试试HaskellDB。它基本上看你的模式,生成一些数据结构,然后给你类型安全的方式来查询。它已经存在了相当长的一段时间,社区的意见是,它是好的和稳定的。要使用它,你需要一些底层的Haskell DB库,比如HSQL。祝你好运!
b1payxdu2#
ORM库存在的原因是C#或Java中的对象与您存储在数据库中的对象之间存在相对较大的差异。这在Haskell中不是一个问题,因为:1.它没有对象1.数据库和Haskell列表都有它们在数学集合论中的灵感,所以它们之间的摩擦比数据库和对象之间的摩擦要小得多。
biswetbf3#
Persistent非常好用,它允许你依靠类型推断来确定查询所涉及的表。例如,如果我在“models”文件中有以下内容:
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 ] []
型它会知道我指的是哪些表,当然,你可能不想写这样的部分代码,但我想强调的只是查询。
fnx2tebb4#
我个人只用了“真实的世界Haskell”推荐的Database.HDBC:http://book.realworldhaskell.org/read/using-databases.html但我同意使用更高级别的数据库访问层确实有意义,我可能会尝试在未来的项目中使用这样的模型。关于这个主题,我发现了2012年的这篇文章,它提供了Haskell的历史和比较:http://www.yesodweb.com/blog/2012/03/history-of-persistence从这篇文章中,我推断Persistent(documentation)和Groundhog(some documentation,examples)是这个领域最有前途的库。这两个库都支持你提到的数据库; Groundhog在这篇文章中没有写,但你可以看到它支持你感兴趣的数据库。还要注意this thread on Haskell-beginners,其中提到Esqueletto是更新操作的更好选择。请注意,Persistent与Yesod一起发布,因此可能会有更多的追随者。
envsm3lx5#
实际上,我非常喜欢HAppS(HAppS-State)的方法,它允许你忘记ORM的编组/解编组,让你简单地使用Haskell的数据类型。
5ktev3wc6#
您是否浏览过http://hackage.haskell.org/packages/archive/pkg-list.html#cat:Database上的数据库Map和访问包我还没有使用过它们,所以不能推荐任何一个特定的。我也不知道你打算使用什么数据库。
nr7wwzry7#
由于最后一个答案是10岁,让我添加一个新的工具,应该适合您的法案:https://haskell-beam.github.io/beam/它支持Postgres,Mysql,SQLite。TemplateHaskell不是必需的。所有查询都是用DSL编写的,如果它们编译,它们将是有效的SQL。
7条答案
按热度按时间uujelgoq1#
我心目中的库不是一个ORM,但它仍然可以做你想要的。
如果你想让你的数据库访问安全,同时把东西很好地集成到你的程序中,那么试试HaskellDB。它基本上看你的模式,生成一些数据结构,然后给你类型安全的方式来查询。它已经存在了相当长的一段时间,社区的意见是,它是好的和稳定的。
要使用它,你需要一些底层的Haskell DB库,比如HSQL。
祝你好运!
b1payxdu2#
ORM库存在的原因是C#或Java中的对象与您存储在数据库中的对象之间存在相对较大的差异。这在Haskell中不是一个问题,因为:
1.它没有对象
1.数据库和Haskell列表都有它们在数学集合论中的灵感,所以它们之间的摩擦比数据库和对象之间的摩擦要小得多。
biswetbf3#
Persistent非常好用,它允许你依靠类型推断来确定查询所涉及的表。例如,如果我在“models”文件中有以下内容:
字符串
然后我可以这样做:
型
它会知道我指的是哪些表,当然,你可能不想写这样的部分代码,但我想强调的只是查询。
fnx2tebb4#
我个人只用了“真实的世界Haskell”推荐的Database.HDBC:http://book.realworldhaskell.org/read/using-databases.html
但我同意使用更高级别的数据库访问层确实有意义,我可能会尝试在未来的项目中使用这样的模型。关于这个主题,我发现了2012年的这篇文章,它提供了Haskell的历史和比较:http://www.yesodweb.com/blog/2012/03/history-of-persistence
从这篇文章中,我推断Persistent(documentation)和Groundhog(some documentation,examples)是这个领域最有前途的库。这两个库都支持你提到的数据库; Groundhog在这篇文章中没有写,但你可以看到它支持你感兴趣的数据库。
还要注意this thread on Haskell-beginners,其中提到Esqueletto是更新操作的更好选择。
请注意,Persistent与Yesod一起发布,因此可能会有更多的追随者。
envsm3lx5#
实际上,我非常喜欢HAppS(HAppS-State)的方法,它允许你忘记ORM的编组/解编组,让你简单地使用Haskell的数据类型。
5ktev3wc6#
您是否浏览过http://hackage.haskell.org/packages/archive/pkg-list.html#cat:Database上的数据库Map和访问包
我还没有使用过它们,所以不能推荐任何一个特定的。我也不知道你打算使用什么数据库。
nr7wwzry7#
由于最后一个答案是10岁,让我添加一个新的工具,应该适合您的法案:
https://haskell-beam.github.io/beam/
它支持Postgres,Mysql,SQLite。TemplateHaskell不是必需的。所有查询都是用DSL编写的,如果它们编译,它们将是有效的SQL。