Pregunta

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

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

¿Fue útil?

Solución

La biblioteca que tengo en mente no es un ORM, pero aun así puede hacer lo que quieras.

Si desea algo que haga que el acceso a su base de datos sea seguro y al mismo tiempo integre bien las cosas en su programa, pruébelo HaskellDB.Básicamente, analiza su esquema, genera algunas estructuras de datos y luego le brinda formas seguras de realizar consultas.Ya existe desde hace bastante tiempo y la opinión de la comunidad es que es bueno y estable.

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

¡Buena suerte!

Otros consejos

La razón por la que existen las bibliotecas ORM es que existe una diferencia relativamente grande entre los objetos en C# o Java y lo que se 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 las listas de Haskell se inspiran en la teoría matemática de conjuntos, por lo que la fricción entre ellas es mucho menor que entre las bases de datos y los objetos.

Persistente es bastante agradable de usar y le permite confiar en la inferencia de tipos para determinar la tabla con 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 refiero.Por supuesto, probablemente no quieras escribir código parcial como este, pero quería enfatizar solo las consultas.

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

Pero estoy de acuerdo en que definitivamente tiene sentido utilizar una capa de acceso a la base de datos de nivel superior, y probablemente intentaré pasar a ese modelo para proyectos futuros.Sobre este tema, encontré esta publicación de 2012 que proporciona una historia y una comparación de dichas soluciones para Haskell:http://www.yesodweb.com/blog/2012/03/history-of-persistence

De ahí deduzco que Persistente (documentación) y marmota (alguna documentacion, ejemplos) son las bibliotecas más prometedoras en este ámbito.Ambas bibliotecas admiten las bases de datos que mencionas;para Groundhog no está escrito en esta publicación pero en este anuncio puede ver que admite exactamente las bases de datos que le interesan.

También tenga en cuenta este hilo sobre Haskell-principiantes en el cual Esqueleto 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 un mayor número de seguidores.

De hecho, me gusta mucho el enfoque de HAppS (Estado HAppS) que le permite olvidarse de pasar por el complicado proceso de ordenación/desordenación de ORM y le permite simplemente usar los tipos de datos de Haskell.

¿Ha revisado los paquetes de acceso y mapeo de bases de datos enhttp://hackage.haskell.org/packages/archive/pkg-list.html#cat:Database

No los he usado, así que no puedo recomendar ninguno en particular.Tampoco sé qué bases de datos planeas utilizar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top