Como posso fazer o esqueleto gerar uma string SQL a partir de uma from
instrução?
A documentação do toRawSql
diz que "você pode simplesmente ativar o log de consultas de persistente". Tentei todas as formas possíveis MonadLogger
que pude entender, mas nunca imprimi nenhum SQL. A mesma documentação também diz "manualmente usar esta função ... é possível, mas tedioso". No entanto, nenhum construtor do tipo, nem nenhuma função que retorne valores do tipo, QueryType
é exportado. Consegui contornar isso observando que QueryType
é um newtype
e usando unsafeCoerce
!
Também fui forçado a fornecer um Connection
(que obtive via SQLite), embora não deva haver necessidade de conectar-se a um banco de dados para gerar o SQL.
Isso é o que eu tenho. Deve haver uma maneira melhor.
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
instâncias inferidas para gerar strings SQL específicas do banco de dados .Respostas:
Desde que esta questão foi postada,
esqueleto
ela passou por uma série de revisões importantes. A partir da versão 2.1.2 e de várias versões anteriores, oQueryType a
parâmetro que precisava de seuunsafeCoerce
foi removidotoRawSql
; aquela grande verruga não é mais necessária.Conforme implementado atualmente, um
Connection
é necessário. Eu acredito que, como indica o nome sinônimo tipoIdentInfo
,esqueleto
usa isso para identificadores de compilação na consulta. Pode, por exemplo, adicionar o nome do banco de dados. Eu realmente não investiguei a fonte com profundidade suficiente. Basta dizer que passar uma conexão falsa (ou sejaundefined
) não funciona; Não sei se uma conexão simulada poderia ser implementada. Sua solução parece viável.O resto da solução deve funcionar bem. Como
toRawSql
é explicitamente uma função interna, a API aqui parece razoável. Embora outros observem que "deveria" ser possível gerar uma string de conexão neutra, isso aparece fora do escopo detoRawSql
.Você mencionou que não poderia usar
MonadLogger
conforme recomendado. O que você tentou e o que aconteceu?fonte
MonadLogger
infelizmente. Já faz algum tempo.toRawSql
funciona para o caso de uso desta pergunta agora? Eu configurei umesqueleto
ambiente para testá-lo, mas não tive tempo para descobrirpersistent
e todas as outras máquinas para realmente construir e consumir uma consulta real.