Wie kann ich esqueleto dazu bringen, eine SQL-Zeichenfolge aus einer from
Anweisung zu generieren ?
In der Dokumentation von toRawSql
heißt es, dass "Sie möglicherweise nur die Abfrageprotokollierung von persistent aktivieren". Ich habe alle möglichen Formen ausprobiert MonadLogger
, die ich verstehen konnte, aber es wurde nie SQL gedruckt. In derselben Dokumentation heißt es auch "Manuelles Verwenden dieser Funktion ... ist möglich, aber langwierig". Es werden jedoch weder Konstruktoren des Typs noch Funktionen QueryType
exportiert , die Werte des Typs zurückgeben . Ich habe es geschafft, dies zu umgehen, indem ich bemerkt habe, dass QueryType
es ein ist newtype
und verwendet unsafeCoerce
!
Ich war auch gezwungen, eine Connection
(die ich über SQLite erhalten habe) bereitzustellen , obwohl es nicht erforderlich sein sollte, eine Verbindung zu einer Datenbank herzustellen, um SQL zu generieren.
Das habe ich. Es muss einen besseren Weg geben.
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
Instanzen verwendet, um datenbankspezifische SQL-Zeichenfolgen zu generieren.Antworten:
In der Zeit seit der Veröffentlichung dieser Frage wurden
esqueleto
einige wichtige Änderungen vorgenommen. Ab Version 2.1.2 und mehreren früheren Versionen wurde derQueryType a
Parameter, für den Sie erforderlichunsafeCoerce
waren, entfernttoRawSql
. Diese Hauptwarze ist nicht mehr notwendig.Wie derzeit implementiert,
Connection
ist a erforderlich. Ich glaube, dass, wie durch den Typensynonymnamen angegebenIdentInfo
, diesesqueleto
verwendet wird, um Bezeichner in der Abfrage zu erstellen. Es kann beispielsweise den Datenbanknamen hinzufügen. Ich habe die Quelle nicht wirklich gründlich genug untersucht. Es genügt zu sagen, dass das Weitergeben einer gefälschten Verbindung (dhundefined
) nicht funktioniert. Ich weiß nicht, ob eine Scheinverbindung implementiert werden könnte. Ihre Lösung scheint praktikabel.Der Rest Ihrer Lösung sollte gut funktionieren. Da
toRawSql
es sich explizit um eine interne Funktion handelt, erscheint die API hier sinnvoll. Obwohl andere bemerken, dass es "möglich" sein sollte, eine verbindungsneutrale Zeichenfolge zu generieren, erscheint dies außerhalb des Bereichs vontoRawSql
.Sie erwähnen, dass Sie nicht
MonadLogger
wie empfohlen verwenden konnten. Was hast du versucht und was ist passiert?quelle
MonadLogger
leider nicht erinnern, womit ich es versucht habe . Es ist schon einige Zeit her.toRawSql
es jetzt für den Anwendungsfall dieser Frage funktioniert? Ich habe eineesqueleto
Umgebung eingerichtet, um es auszuprobieren, aber ich hatte keine Zeit, es herauszufindenpersistent
und all die anderen Maschinen, um tatsächlich eine echte Abfrage zu erstellen und zu konsumieren.