Jak uzyskać esqueleto do generowania ciągu SQL z from
instrukcji?
Dokumentacja toRawSql
mówi, że „możesz po prostu włączyć trwałe logowanie zapytań”. Wypróbowałem wszystkie możliwe formy tego MonadLogger
, co mogłem zrozumieć, ale nigdy nie wydrukowałem żadnego SQL. Ta sama dokumentacja mówi również, że „ręczne użycie tej funkcji ... jest możliwe, ale żmudne”. Jednak żadne konstruktory tego typu ani żadne funkcje zwracające wartości typu nie QueryType
są eksportowane. Udało mi się to obejść, zauważając, że QueryType
to jest newtype
i używając unsafeCoerce
!
Zostałem również zmuszony do dostarczenia Connection
(które otrzymałem przez SQLite), mimo że nie powinno być potrzeby łączenia się z bazą danych w celu wygenerowania SQL.
Oto, co mam. Musi być lepszy sposób.
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
instancji do generowania ciągów SQL specyficznych dla bazy danych.Odpowiedzi:
Od czasu opublikowania tego pytania
esqueleto
przeszedł szereg ważnych poprawek. Od wersji 2.1.2 i kilku wcześniejszych,QueryType a
parametr, który wymagał twojegounsafeCoerce
, został usunięty ztoRawSql
; że duża brodawka nie jest już potrzebna.Jak obecnie zaimplementowano,
Connection
wymagany jest plik . Uważam, że, jak wskazuje nazwa synonimu typuIdentInfo
,esqueleto
używa tego do budowania identyfikatorów w zapytaniu. Może na przykład dodać nazwę bazy danych. Tak naprawdę nie odkryłem źródła wystarczająco głęboko. Wystarczy powiedzieć, że przekazywanie fałszywego połączenia (tj.undefined
) Nie działa; Nie wiem, czy można by zaimplementować pozorowane połączenie. Twoje rozwiązanie wydaje się wykonalne.Reszta rozwiązania powinna działać dobrze. Ponieważ
toRawSql
jest to wyraźnie funkcja wewnętrzna, interfejs API tutaj wydaje się rozsądny. Chociaż inni zauważają, że "powinno" być możliwe wygenerowanie łańcucha neutralnego dla połączenia, który pojawia się poza zakresemtoRawSql
.Wspomniałeś, że nie możesz używać
MonadLogger
zgodnie z zaleceniami. Czego próbowałeś i co się stało?źródło
MonadLogger
niestety. To było jakiś czas temu.toRawSql
działa w przypadku użycia tego pytania? Skonfigurowałemesqueleto
środowisko, aby to wypróbować, ale nie miałem czasu, aby wymyślićpersistent
i wszystkie inne maszyny, aby faktycznie skonstruować i przetworzyć prawdziwe zapytanie.