¿Cómo puedo hacer que esqueleto genere una cadena SQL a partir de una from
declaración?
La documentación de toRawSql
dice que "puede activar el registro de consultas de persistente". Intenté todas las formas posibles de MonadLogger
eso que pude entender, pero nunca imprimí ningún SQL. La misma documentación también dice "usar manualmente esta función ... es posible pero tedioso". Sin embargo, no QueryType
se exportan constructores del tipo ni funciones que devuelvan valores del tipo . ¡Me las arreglé para evitar esto notando que QueryType
es un newtype
y usando unsafeCoerce
!
También me vi obligado a proporcionar un Connection
(que obtuve a través de SQLite) aunque no debería haber necesidad de conectarse a una base de datos para generar el SQL.
Esto es lo que tengo. Debe haber una mejor manera.
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
instancias inferidas para generar cadenas SQL específicas de la base de datos .Respuestas:
En el tiempo transcurrido desde que se publicó esta pregunta,
esqueleto
ha pasado por una serie de revisiones importantes. A partir de la versión 2.1.2 , y varias versiones anteriores, elQueryType a
parámetro que necesitaba suunsafeCoerce
ha sido eliminadotoRawSql
; esa gran verruga ya no es necesaria.Como se implementa actualmente,
Connection
se requiere un. Creo que, como lo indica el nombre del sinónimo de tipoIdentInfo
,esqueleto
usa esto para construir identificadores en la consulta. Puede, por ejemplo, agregar el nombre de la base de datos. Realmente no he sondeado la fuente con suficiente profundidad. Baste decir que pasar una conexión falsa (es decirundefined
) no funciona; No sé si se podría implementar una conexión simulada. Su solución parece viable.El resto de su solución debería funcionar bien. Dado que
toRawSql
es explícitamente una función interna, la API aquí parece razonable. Aunque otros señalan que "debería" ser posible generar una cadena de conexión neutra, que aparece fuera del alcance detoRawSql
.Mencionas que no podrías usar
MonadLogger
como se recomienda. ¿Qué intentaste y qué pasó?fuente
MonadLogger
Desafortunadamente, no recuerdo con qué lo intenté . Fue hace bastante tiempo.toRawSql
funciona ahora para el caso de uso de esta pregunta? Configuré unesqueleto
entorno para probarlo, pero no he tenido tiempo de averiguarlopersistent
y toda la otra maquinaria para construir y consumir una consulta real.