Bagaimana saya bisa membuat esqueleto menghasilkan string SQL untuk saya?

86

Bagaimana saya bisa membuat esqueleto menghasilkan string SQL dari frompernyataan?

Dokumentasi toRawSqlmengatakan bahwa "Anda hanya dapat mengaktifkan pencatatan kueri yang persisten". Saya mencoba semua kemungkinan bentuk MonadLoggeryang bisa saya mengerti, tetapi tidak pernah mencetak SQL apa pun. Dokumentasi yang sama juga mengatakan "secara manual menggunakan fungsi ini ... mungkin tetapi membosankan". Namun, tidak ada konstruktor tipe, atau fungsi apa pun yang mengembalikan nilai tipe, QueryTypeyang diekspor. Saya berhasil menyiasati ini dengan memperhatikan bahwa QueryTypea newtypedan menggunakan unsafeCoerce!

Saya juga dipaksa untuk menyediakan Connection(yang saya dapatkan melalui SQLite) meskipun seharusnya tidak perlu terhubung ke database untuk menghasilkan SQL.

Inilah yang saya punya. Pasti ada cara yang lebih baik.

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

Tom Ellis
sumber
2
Saya percaya alasan Anda perlu memberikan koneksi adalah karena polimorfik pada database dan menggunakan SqlPersistcontoh yang disimpulkan untuk menghasilkan string SQL khusus database.
Thomas
2
Koneksi dan jenis database yang mendasarinya adalah hal yang berbeda. Seharusnya dimungkinkan untuk menghasilkan string SQL secara murni.
Tom Ellis

Jawaban:

2

Sejak pertanyaan ini diposting, esqueletotelah melalui sejumlah revisi besar. Sejak versi 2.1.2 , dan beberapa versi sebelumnya, QueryType aparameter yang mengharuskan Anda unsafeCoercetelah dihapus toRawSql; kutil mayor itu tidak lagi diperlukan.

Seperti yang saat ini diterapkan, Connectiondiperlukan. Saya percaya bahwa, seperti yang ditunjukkan oleh nama sinonim tipe IdentInfo,, esqueletomenggunakan ini untuk membangun pengidentifikasi dalam kueri. Mungkin, misalnya, menambahkan nama database. Saya belum benar-benar menggali sumbernya secara cukup mendalam. Cukuplah untuk mengatakan, melewatkan koneksi palsu (yaitu undefined) tidak berhasil; Saya tidak tahu apakah koneksi tiruan dapat diterapkan. Solusi Anda tampaknya bisa diterapkan.

Solusi lainnya seharusnya berfungsi dengan baik. Karena toRawSqlsecara eksplisit merupakan fungsi internal, API di sini tampaknya masuk akal. Meskipun orang lain mencatat bahwa "seharusnya" dapat menghasilkan string koneksi netral, yang muncul di luar cakupan toRawSql.

Anda menyebutkan bahwa Anda tidak dapat menggunakan MonadLoggerseperti yang disarankan. Apa yang Anda coba, dan apa yang terjadi?

Christian Conkle
sumber
MonadLoggerSayangnya saya tidak ingat dengan apa yang saya coba . Sudah lama sekali.
Tom Ellis
Apakah Anda kebetulan memiliki proyek uji yang berguna untuk melihat apakah toRawSqlberfungsi untuk kasus penggunaan pertanyaan ini sekarang? Saya menyiapkan esqueletolingkungan untuk mencobanya, tetapi saya belum punya waktu untuk mencari tahu persistentdan semua mesin lain untuk benar-benar membangun dan menggunakan kueri yang sebenarnya.
Christian Conkle
Saya tidak memiliki lingkungan pengujian apa pun atau proyek esqueleto sama sekali, maaf.
Tom Ellis