2008-09-19 32 views
34

¿Cuál es la mejor manera de interactuar con una base de datos utilizando Haskell? Estoy acostumbrado a usar algún tipo de ORM (ORM de Django, Hibernate, etc.) y algo similar sería bueno al crear aplicaciones con HAppS.¿Hay alguna herramienta ORM para Haskell?

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

Respuesta

13

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

Si quieres algo que haga que tus accesos a la base de datos sean seguros mientras integras cosas en tu programa, entonces prueba HaskellDB. Básicamente mira su esquema, genera algunas estructuras de datos y luego le da tipos de formas seguras de consultar. Ha existido por bastante tiempo y la opinión de la comunidad es que es bueno y estable.

Para usarlo, necesitará alguna biblioteca subyacente de Haskell DB como HSQL.

Buena suerte!

+0

Documento de HaskellDB: www.cs.chalmers.se/~bringert/publ/haskelldb/haskelldb-db-2005.pdf – rcreswick

+1

HaskellDB tiene el problema de que actualmente no se compila con versiones recientes de GHC (6.8 o 6.10). –

+0

@ErikHesselink [HaskellDB] (https://github.com/m4dc4p/haskelldb) (github) ahora tiene soporte para GHC 7.10. –

1

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

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

+0

Actualicé la pregunta para listar las bases de datos que me interesan, pero no debería ser un criterio de filtrado. He revisado un poco el hackage un poco en el pasado, pero probablemente debería arrastrarlo de nuevo. Sin embargo, me gustaría saber de personas con experiencia personal. – rcreswick

2

De hecho, me gusta mucho el enfoque de HAppS (HAppS-State) que te permite olvidarte de pasar por el pelotón de ORM de marshalling/unmarshalling y simplemente usar los tipos de datos de Haskell.

13

La razón por la que existen las bibliotecas ORM es que existe 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. que no tiene objetos
  2. Ambas bases de datos y la lista de Haskell tienen su inspiración en la teoría matemática de conjuntos, por lo que la fricción entre ellos es mucho menor que entre las bases de datos y objetos
+15

Uso SqlAlchemy en Python porque hace que sea fácil ensamblar/reutilizar sentencias SQL sin manipular cadenas directamente. ¿Hay algo como esto para Haskell? –

2

personalmente solamente Database.HDBC que es recomendado por "Real World Haskell" acostumbrado: http://book.realworldhaskell.org/read/using-databases.html

Pero estoy de acuerdo que sin duda tiene sentido utilizar una capa de acceso a base de datos de más alto nivel, y que probablemente Trate de pasar a tal modelo para proyectos futuros. Sobre este tema, me encontré con este post de 2012, que ofrece una historia y una comparación de este tipo de soluciones para Haskell: http://www.yesodweb.com/blog/2012/03/history-of-persistence

A partir de ella, supongo que Persistente (documentation) y de la marmota (some documentation, examples) son las bibliotecas más prometedores en esta área. Ambas bibliotecas admiten las bases de datos que mencionas; de la marmota no está escrito en este post pero in this announcement se puede ver que se apoya exactamente el DBS le interesa.

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

Tenga en cuenta que Persistent se envía con Yesod y, como tal, puede tener una mayor cantidad de seguidores.

8

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

User 
    name Text 
    age Int 

Login 
    user UserId 
    login Text 
    passwd Text 

entonces yo podría hacer esto:

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

Y sabría qué tablas que quería decir. Por supuesto, es probable que no desee escribir un código parcial como este, pero quería enfatizar solo las consultas.

Cuestiones relacionadas