Benim için bir SQL dizesi oluşturması için nasıl esqueleto alabilirim?


86

Bir fromifadeden bir SQL dizesi oluşturmak için esqueleto'yu nasıl edinebilirim ?

Belgeleri, toRawSql"kalıcı sorgu günlük kaydını açabilirsiniz" diyor. MonadLoggerAnlayabildiğim tüm olası biçimlerini denedim , ancak hiçbir SQL yazmadı. Aynı dokümantasyon ayrıca "bu işlevi manuel olarak kullanmak ... mümkündür ama sıkıcıdır" diyor. Ancak, türün kurucuları veya türün değerlerini döndüren işlevler QueryTypedışa aktarılmaz. Bunun QueryTypebir newtypeve kullanarak olduğunu fark ederek bunu aşmayı başardım unsafeCoerce!

Ayrıca ConnectionSQL'i oluşturmak için bir veritabanına bağlanmaya gerek olmamasına rağmen bir (SQLite aracılığıyla aldığım) sağlamak zorunda kaldım .

Elimde olan bu. Daha iyi bir yolu olmalı.

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
Ona bir bağlantı vermenizin nedeninin, veritabanında polimorfik olması ve veri tabanına SqlPersistözgü SQL dizeleri oluşturmak için çıkarılan örnekler kullanması olduğuna inanıyorum .
Thomas

2
Bağlantı ve temeldeki veritabanının türü farklı şeylerdir. SQL dizgesinin tamamen oluşturulması mümkün olmalıdır.
Tom Ellis

Yanıtlar:


2

Bu sorunun gönderilmesinden bu yana, esqueletobir dizi büyük revizyondan geçti. İtibariyle sürümü 2.1.2 ve birkaç önceki sürümleri, QueryType asenin gerektirdiği parametre unsafeCoercekaldırıldı toRawSql; o büyük siğil artık gerekli değildir.

Şu anda uygulandığı gibi, a Connectiongereklidir. Ben tür eşanlamlı adı ile belirtildiği üzere, inanıyoruz IdentInfo, esqueletosorguda inşa tanımlayıcıları için kullanır. Örneğin, veritabanı adını ekleyebilir. Kaynağı yeterince derinlemesine incelemedim. Sahte bir bağlantı (yani undefined) geçmenin işe yaramadığını söylemek yeterlidir ; Sahte bir bağlantının uygulanıp uygulanamayacağını bilmiyorum. Çözümünüz uygulanabilir görünüyor.

Çözümünüzün geri kalanı iyi çalışmalıdır. Yana toRawSqlaçıkça bir iç fonksiyonudur API burada makul görünüyor. Başkaları, kapsamı dışında görünen, bağlantıdan bağımsız bir dizginin üretilmesinin "gerektiğini" belirtmesine rağmen toRawSql.

MonadLoggerTavsiye edildiği gibi kullanamayacağınızı söylediniz . Ne denedin ve ne oldu?


Ne MonadLoggeryazık ki ne denediğimi hatırlayamıyorum . Oldukça uzun zaman önceydi.
Tom Ellis

toRawSqlŞimdi bu sorunun kullanım durumu için işe yarayıp yaramadığını görmek için elinizin altında bir test projeniz var mı? esqueletoDenemek için bir ortam kurdum, ancak anlamaya persistentve gerçek bir sorgu oluşturup tüketecek diğer tüm makinelere zamanım olmadı .
Christian Conkle

Üzgünüm, herhangi bir test ortamım veya hiç esqueleto projem yok.
Tom Ellis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.