¿Hay alguna herramienta OR para Haskell?


¿Cuál es la mejor manera de interactuar con una base de datos usando Haskell? Estoy acostumbrado a usar algún tipo de OR (Dj de Django, hibernar, etc.) y algo similar sería bueno al crear aplicaciones con HAppS .

Edit: Me gustaría ser libre de elegir entre Postgresql MySQL y SQLite en lo que respecta a las bases de datos reales.

Author: Greg Bacon, 2008-09-19

6 answers

La biblioteca que tengo en mente no es un OR, pero aún puede hacer lo que quieras.

Si desea algo que haga que los accesos a su base de datos sean seguros mientras integra cosas en su programa, pruebe HaskellDB. Básicamente mira su esquema, genera algunas estructuras de datos, y luego le da formas seguras de tipo de consulta. Ha existido por bastante tiempo y la opinión de la comunidad es que es bueno y estable.

Para usarlo, necesitará algo subyacente Biblioteca Haskell DB como HSQL.

¡Buena suerte!

 14
Author: Jason Dagit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-19 22:58:58

La razón por la que existen bibliotecas OR es que hay una gran diferencia relativa entre los objetos en C# o Java y lo que almacena en una base de datos. Esto no es tanto un problema en Haskell porque:

  1. no tiene Objetos
  2. Tanto las bases de datos como la lista de Haskell tienen su inspiración en la teoría de conjuntos matemáticos, por lo que la fricción entre ellas es mucho menor que entre las bases de datos y los Objetos.
 13
Author: tomjen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-15 22:52:56

Persistente es bastante agradable de usar, y le permite confiar en la inferencia de tipos para determinar la tabla a la que se relaciona su consulta. Por ejemplo, si tengo lo siguiente en mi archivo "modelos":

User
    name Text
    age Int

Login
    user UserId
    login Text
    passwd Text

Entonces podría hacer esto:

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

Y sabría a qué tablas me refería. Por supuesto, probablemente no quieras escribir código parcial como este, pero quería enfatizar solo las consultas.

 8
Author: John Wiegley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-28 22:26:09

Yo personalmente usé solo la base de datos .HDBC que es recomendado por " Real World Haskell": http://book.realworldhaskell.org/read/using-databases.html

Pero estoy de acuerdo en que definitivamente tiene sentido usar una capa de acceso a bases de datos de nivel superior, y probablemente intentaré pasar a un modelo de este tipo para proyectos futuros. Sobre este tema, encontré este post de 2012 que proporciona una historia y comparación de tales soluciones para Haskell: http://www.yesodweb.com/blog/2012/03/history-of-persistence

De ella, deduzco que Persistente ( documentación ) y Marmota (alguna documentación, examples) son las bibliotecas más prometedoras en esta área. Ambas bibliotecas soportan las bases de datos que mencionas; para Groundhog no está escrito en este post sino en este anuncio puedes ver que soporta exactamente el DBs que te interesa.

También tenga en cuenta esto hilo en Haskell-beginners en el que Esqueletto se menciona como una mejor opción para las operaciones de actualización.

Tenga en cuenta que las naves persistentes con Yesod y como tal pueden tener un mayor número de seguidores.

 3
Author: Emmanuel Touzery,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-18 09:45:04

En realidad me gusta mucho el enfoque de HAppS ( HAppS-State) que le permite olvidarse de pasar por el cludge de marshalling/unmarshalling de OR y le permite simplemente usar los tipos de datos de Haskell.

 2
Author: eelco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-02 06:36:37

¿Ha mirado a través de la asignación de la base de datos y los paquetes de acceso en http://hackage.haskell.org/packages/archive/pkg-list.html#cat:Database

No las he usado, así que no puedo recomendar ninguna en particular. Tampoco sé qué bases de datos está planeando usar.

 1
Author: wnoise,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-19 21:13:05