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.

È stato utile?

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é:

  1. Non ha oggetti
  2. 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top