Comment puis-je obtenir esqueleto pour générer une chaîne SQL à partir d'une from
instruction?
La documentation de toRawSql
dit que "vous pouvez simplement activer la journalisation des requêtes de persistant". J'ai essayé toutes les formes possibles MonadLogger
que je pouvais comprendre, mais cela n'a jamais imprimé de SQL. La même documentation dit également que "l'utilisation manuelle de cette fonction ... est possible mais fastidieuse". Cependant, aucun constructeur du type, ni aucune fonction renvoyant des valeurs du type, ne QueryType
sont exportés. J'ai réussi à contourner cela en remarquant que QueryType
c'est un newtype
et en utilisant unsafeCoerce
!
J'ai également été obligé de fournir un Connection
(que j'ai obtenu via SQLite) même s'il ne devrait pas être nécessaire de me connecter à une base de données pour générer le SQL.
Voilà ce que j'ai. Il doit y avoir un meilleur moyen.
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
SqlPersist
instances inférées pour générer des chaînes SQL spécifiques à la base de données .Réponses:
Depuis que cette question a été publiée,
esqueleto
a subi un certain nombre de révisions majeures. Depuis la version 2.1.2 , et plusieurs versions antérieures, leQueryType a
paramètre qui nécessitait votreunsafeCoerce
a été supprimé detoRawSql
; cette verrue majeure n'est plus nécessaire.Tel qu'actuellement mis en œuvre, un
Connection
est requis. Je crois que, comme indiqué par le nom de synonyme de typeIdentInfo
,esqueleto
utilise ceci pour créer des identificateurs dans la requête. Il peut, par exemple, ajouter le nom de la base de données. Je n'ai pas vraiment exploré la source suffisamment en profondeur. Qu'il suffise de dire que passer une fausse connexion (c'est-à-direundefined
) ne fonctionne pas; Je ne sais pas si une connexion simulée pourrait être mise en œuvre. Votre solution semble réalisable.Le reste de votre solution devrait fonctionner correctement. Puisqu'il
toRawSql
s'agit explicitement d'une fonction interne, l'API semble ici raisonnable. Bien que d'autres notent qu'il "devrait" être possible de générer une chaîne indépendante de la connexion, cela apparaît en dehors de la portée detoRawSql
.Vous mentionnez que vous ne pouvez pas utiliser
MonadLogger
comme recommandé. Qu'avez-vous essayé et que s'est-il passé?la source
MonadLogger
malheureusement. C'était il y a assez longtemps.toRawSql
fonctionne maintenant pour le cas d'utilisation de cette question? J'ai mis en place unesqueleto
environnement pour l'essayer, mais je n'ai pas eu le temps de comprendrepersistent
et toutes les autres machines pour réellement construire et consommer une vraie requête.