Come posso far sì che esqueleto generi una stringa SQL per me?


86

Come posso ottenere esqueleto per generare una stringa SQL da fromun'istruzione?

La documentazione di toRawSqldice che "puoi semplicemente attivare la registrazione delle query di persistente". Ho provato tutte le forme possibili di MonadLoggerquello che potevo capire, ma non ha mai stampato alcun SQL. La stessa documentazione dice anche "usare manualmente questa funzione ... è possibile ma noioso". Tuttavia, non QueryTypevengono esportati né i costruttori del tipo né le funzioni che restituiscono valori del tipo . Sono riuscito a aggirare questo problema notando che QueryTypeè un newtypee usando unsafeCoerce!

Sono stato anche costretto a fornire un Connection(che ho ottenuto tramite SQLite) anche se non dovrebbe essere necessario connettersi a un database per generare l'SQL.

Questo è quello che ho. Deve esserci un modo migliore.

withSqliteConn ":memory:" $
    \conn -> return $ toRawSql SELECT
                               (unsafeCoerce ((const mempty)
                                  :: a -> Text.Lazy.Builder.Builder))
                               (conn, initialIdentState) myFromStatement)

http://hackage.haskell.org/package/esqueleto-1.3.4.2/docs/Database-Esqueleto-Internal-Sql.html


2
Credo che il motivo per cui è necessario fornire una connessione è perché è polimorfico sul database e utilizza SqlPersististanze dedotte per generare stringhe SQL specifiche del database .
Thomas,

2
Tuttavia, la connessione e il tipo di database sottostante sono cose diverse. Dovrebbe essere possibile generare puramente la stringa SQL.
Tom Ellis

Risposte:


2

Da quando questa domanda è stata pubblicata, esqueletoha subito una serie di importanti revisioni. A partire dalla versione 2.1.2 e da diverse versioni precedenti, il QueryType aparametro che richiedeva il tuo unsafeCoerceè stato rimosso da toRawSql; quella grande verruca non è più necessaria.

Come attualmente implementato, Connectionè richiesto un file. Credo che, come indicato dal nome del sinonimo di tipo IdentInfo, lo esqueletoutilizzi per creare identificatori nella query. Può, ad esempio, aggiungere il nome del database. Non ho davvero scandagliato la fonte abbastanza in profondità. Basti dire che il passaggio di una connessione falsa (cioè undefined) non funziona; Non so se potrebbe essere implementata una connessione fittizia. La tua soluzione sembra praticabile.

Il resto della tua soluzione dovrebbe funzionare bene. Poiché toRawSqlè esplicitamente una funzione interna, l'API qui sembra ragionevole. Sebbene altri notino che "dovrebbe" essere possibile generare una stringa indipendente dalla connessione, ciò non rientra nell'ambito di toRawSql.

Hai detto che non potresti usare MonadLoggercome raccomandato. Cosa hai provato e cosa è successo?


Non ricordo con cosa ho provato MonadLoggerpurtroppo. È stato parecchio tempo fa.
Tom Ellis

Ti capita di avere un progetto di prova a portata di mano per vedere se toRawSqlfunziona per il caso d'uso di questa domanda ora? Ho impostato un esqueletoambiente per provarlo, ma non ho avuto il tempo di capire persistente tutti gli altri macchinari per costruire e utilizzare effettivamente una query reale.
Christian Conkle

Non ho alcun tipo di ambiente di test o progetti esqueleto, mi dispiace.
Tom Ellis
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.