Як я можу отримати esqueleto для генерації рядка SQL для мене?


86

Як я можу отримати esqueleto для генерації рядка SQL з fromоператора?

У документації toRawSqlсказано, що "ви можете просто увімкнути реєстрацію запитів постійних". Я спробував усі можливі форми, MonadLoggerякі я міг зрозуміти, але він ніколи не друкував жодного SQL. У цій же документації також сказано, що "використання цієї функції вручну ... можливо, але нудно". Однак не QueryTypeекспортуються конструктори типу, а також будь-які функції, що повертають значення типу . Мені вдалося обійти це, помітивши, що QueryTypeце newtypeі використання unsafeCoerce!

Я також був змушений надати Connection(який я отримав через SQLite), хоча для створення SQL не повинно бути необхідності підключатися до бази даних.

Це те, що я отримав. Має бути кращий спосіб.

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


2
Я вважаю, що причина, по якій вам потрібно надати йому з'єднання, полягає в тому, що вона є поліморфною в базі даних і використовує виведені SqlPersistекземпляри для генерації специфічних для бази даних баз даних .
Томас

2
Однак зв’язок і тип базової бази даних - це різні речі. Має бути можливість генерувати рядок SQL чисто.
Том Елліс,

Відповіді:


2

За той час, як це питання було опубліковано, esqueletoвін пройшов ряд основних переглядів. Починаючи з версії 2.1.2 та декількох попередніх версій, QueryType aпараметр, який вимагав вашого unsafeCoerce, був видалений toRawSql; що велика бородавка більше не потрібна.

Як реалізовується в даний час, Connectionнеобхідний a . Я вважаю, що, як вказує назва синоніму типу IdentInfo, esqueletoвикористовує це для побудови ідентифікаторів у запиті. Наприклад, він може додати ім'я бази даних. Я насправді недостатньо глибоко проклав джерело. Досить сказати, передача фальшивого з'єднання (тобто undefined) не працює; Я не знаю, чи можна було здійснити фіктивне з'єднання. Ваше рішення здається працездатним.

Решта вашого рішення повинна працювати нормально. Оскільки toRawSqlце явно внутрішня функція, API тут видається розумним. Хоча інші зазначають, що "має" бути можливим генерувати нейтральний для з'єднання рядок, який виходить за межі toRawSql.

Ви згадуєте, що не могли використовувати MonadLoggerрекомендовані. Що ви спробували і що сталося?


Не можу згадати, з чим намагався, на MonadLoggerжаль. Це було досить давно.
Том Елліс,

У вас є зручний тестовий проект, щоб перевірити, чи toRawSqlпрацює зараз цей варіант використання? Я створив esqueletoсередовище, щоб випробувати це, але я не встиг це зрозуміти persistentта всі інші механізми, щоб насправді побудувати та спожити справжній запит.
Крістіан Конкл,

У мене взагалі немає ніякого тестового середовища чи будь-яких проектів ескелето, вибачте.
Том Елліс,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.