Esistono strumenti ORM per Haskell?
Domanda
Qual è il modo migliore per interagire con un database usando Haskell? Sono abituato a usare una sorta di ORM (ORM di Django, ibernazione, ecc.) E qualcosa di simile sarebbe bello quando si creano app con Happs .
Modifica: Vorrei essere libero di scegliere tra Postgresql MySql e SQLite per quanto riguarda i database attuali.
Soluzione
La libreria che ho in mente non è un ORM, ma può comunque fare quello che vuoi.
Se vuoi qualcosa che renda sicuro l'accesso al tuo database mentre integri bene le cose nel tuo programma allora prova HaskellDB . Praticamente esamina il tuo schema, genera alcune strutture di dati e quindi ti dà modi sicuri per eseguire query. È in circolazione da un bel po 'e l'opinione della comunità è che sia buona e stabile.
Per usarlo, avrai bisogno di alcune librerie Haskell DB come HSQL.
Buona fortuna!
Altri suggerimenti
Il motivo dell'esistenza delle librerie ORM è che esiste una differenza relativamente grande tra gli oggetti in C # o Java e ciò che si archivia in un database. Questo non è un grosso problema in Haskell perché:
- Non ha oggetti
- Sia i database che l'elenco di Haskell traggono ispirazione dalla teoria degli insiemi matematici, quindi l'attrito tra loro è molto inferiore rispetto a quello tra database e Oggetti.
Persistente è piuttosto piacevole da usare e ti consente di fare affidamento sull'inferenza del tipo per determinare la tabella a cui fa riferimento la tua query. Ad esempio, se nei miei "modelli" ho quanto segue file:
User
name Text
age Int
Login
user UserId
login Text
passwd Text
Quindi potrei farlo:
Just (Entity uid _) <- selectFirst [ UserName ==. "Some User ] []
Just (Entity lid Login {..}) <- selectFirst [ LoginUser ==. uid ] []
E saprebbe quali tabelle intendevo dire. Ovviamente, probabilmente non vorrai scrivere codice parziale come questo, ma volevo enfatizzare solo le query.
Personalmente ho usato solo Database.HDBC che è raccomandato da " Real World Haskell " ;: http://book.realworldhaskell.org/read/using-d Database.html
Ma concordo sul fatto che abbia sicuramente senso utilizzare un livello di accesso DB di livello superiore, e probabilmente proverò a passare a tale modello per progetti futuri. Su questo argomento, ho trovato questo post del 2012 che fornisce una cronologia e un confronto di tali soluzioni per Haskell: http://www.yesodweb.com/blog/2012/03/history -di-persistenza
Da esso, ho raccolto quel persistente ( documentazione ) e Groundhog ( alcuni documenti , esempi ) sono le librerie più promettenti in questo settore. Entrambe le librerie supportano i database citati; per Groundhog non è scritto in questo post ma in questo annuncio annuncio puoi vedere che supporta esattamente i DB a cui sei interessato.
Nota anche questa discussione su Haskell-principianti in cui Esqueletto è menzionato come una scelta migliore per le operazioni di aggiornamento.
Nota che Persistent viene spedito con Yesod e come tale potrebbe avere un seguito maggiore.
In realtà mi piace molto l'approccio di HAppS ( HAppS -Stato ) che ti permette di dimenticare di passare attraverso il clusge di marshalling / unmarshalling di ORM e di usare semplicemente i tipi di dati di Haskell.
Hai esaminato la mappatura del database e accedi ai pacchetti su http://hackage.haskell.org/packages/archive/ pkg-list.html # cat: Database
Non li ho usati, quindi non posso raccomandarne uno in particolare. Inoltre non so quali database stai pianificando di utilizzare.