在OOP语言中,我可能会编写一个数据库包装器,它封装数据库连接,管理模式并提供一些核心操作,例如exec,query,prepare_and_execute.我甚至可能有一个单独的数据库助手类来处理数据库模式,只留下数据库抽象来处理连接.然后,模型包装器/工厂将使用它,它使用数据库抽象类来创建模型类的实例.像这个UML图一样的东西:
解决方法
Haskell中最常用的数据库抽象库是
HDBC.这意味着查询只是表示为带有占位符的字符串.更少的人使用
HaskellDB,它提供了一种类型安全的方法来构建查询.没有什么禁止用户数据类型来表示常见查询和自定义函数来构建它们.
Haskell中的值是不可变的,这意味着使可变对象与数据库中的记录相对应是没有用的.相反,我认为更常见的是定义用户数据类型和函数,这些类型和函数可以对这些类型的数据进行编组和推送/拉取.
每当需要更新数据库时,它们很可能在IO下的某些有状态monad中运行.例如,这将允许保持连接打开,或者在请求之间执行某些操作.
最后,函数是第一类的,因此可以动态构造所有函数.因此,函数本身可以封装您想要的任何信息.
>代表实际数据的代数数据类型(作为不可变值)>转换这些值的应用程序的其余部分>生成查询的函数(封装模式详细信息,将数据封送到Haskell数据类型/从Haskell数据类型封送数据)>(可选)运行查询的有状态monad(隐藏数据库访问的详细信息)>运行查询的函数(隐藏数据库访问的详细信息)