86 votes

Comment puis-je obtenir mes pour générer une chaîne SQL pour moi ?

Comment puis-je obtenir esqueleto pour générer une chaîne SQL à partir d'un from déclaration?

La documentation de l' toRawSql dit que "vous pouvez simplement activer la journalisation des requêtes persistantes". J'ai essayé toutes les formes possibles de l' MonadLogger que je pourrais comprendre, mais il n'a jamais imprimé SQL. La documentation dit aussi "manuellement à l'aide de cette fonction ... est possible mais fastidieux". Cependant, aucun des constructeurs du type, ni aucune des fonctions retournant des valeurs du type, QueryType sont exportés. J'ai réussi à contourner ce problème en remarquant que, QueryType est newtype et à l'aide de unsafeCoerce!

J'ai été aussi obligé de fournir un Connection (que j'ai obtenu via SQLite) même si il ne devrait pas être nécessaire de se connecter à une base de données pour générer le SQL.

C'est ce que j'ai. Il doit y avoir une meilleure façon.

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

2voto

Christian Conkle Points 2452

Au moment où cette question a été posté, esqueleto a subi un certain nombre de révisions importantes. Que de la version 2.1.2, et plusieurs versions antérieures, l' QueryType a paramètre qui a motivé votre unsafeCoerce a été retiré de l' toRawSql; que les grands verrue n'est plus nécessaire.

Tel qu'il est actuellement mis en œuvre, Connection est requis. Je crois que, comme indiqué par le type de nom synonyme, IdentInfo, esqueleto l'utilise pour construire des identificateurs dans la requête. Il peut, par exemple, ajouter le nom de base de données. Je n'ai pas vraiment de plomberie de la source dans assez de profondeur. Qu'il suffise de dire, le passage d'un faux de connexion (c - undefined) ne fonctionne pas; je ne sais pas si un simulacre de connexion pourraient être mises en œuvre. Ta solution me semble réalisable.

Le reste de votre solution devrait fonctionner correctement. Depuis toRawSql est explicitement une fonction interne, l'API ici semble raisonnable. Bien que d'autres notent qu'il "devrait" être possible de générer une connexion neutre de la chaîne, qui apparaît à l'extérieur de la portée de l' toRawSql.

Vous mentionnez que vous ne pouvez pas utiliser MonadLogger comme le recommande. Qu'avez-vous essayer, et ce qui s'est passé?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X