ฉันจะให้ 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อินสแตนซ์ที่อนุมานเพื่อสร้างสตริง SQL เฉพาะฐานข้อมูล
โทมัส

2
การเชื่อมต่อและประเภทของฐานข้อมูลพื้นฐานนั้นแตกต่างกัน ควรเป็นไปได้ที่จะสร้างสตริง SQL อย่างหมดจด
Tom Ellis

คำตอบ:


2

ในช่วงเวลาที่โพสต์คำถามนี้ได้esqueletoมีการแก้ไขครั้งใหญ่หลายครั้ง ในเวอร์ชัน 2.1.2และเวอร์ชันก่อนหน้าหลายรายการ QueryType aพารามิเตอร์ที่จำเป็นของคุณunsafeCoerceถูกลบออกจากtoRawSql; หูดที่สำคัญนั้นไม่จำเป็นอีกต่อไป

ตามที่ใช้ในปัจจุบันConnectionจำเป็นต้องมีa ผมเชื่อว่าตามที่ระบุโดยชื่อไวพจน์ชนิดIdentInfo, esqueletoใช้นี้เพื่อสร้างตัวบ่งชี้ในการค้นหา ตัวอย่างเช่นอาจเพิ่มชื่อฐานข้อมูล ฉันไม่ได้เจาะลึกแหล่งที่มามากพอ พอจะพูดได้ว่าการส่งการเชื่อมต่อปลอม (เช่นundefined) ไม่ได้ผล ฉันไม่รู้ว่าสามารถใช้การเชื่อมต่อจำลองได้หรือไม่ โซลูชันของคุณดูเหมือนจะใช้การได้

ส่วนที่เหลือของโซลูชันของคุณควรทำงานได้ดี เนื่องจากtoRawSqlเป็นฟังก์ชันภายในอย่างชัดเจน API ที่นี่จึงดูสมเหตุสมผล แม้ว่าคนอื่น ๆ ทราบว่า "ควร" toRawSqlจะเป็นไปได้ในการสร้างสตริงการเชื่อมต่อที่เป็นกลางปรากฏอยู่นอกขอบเขตของการที่

คุณระบุว่าใช้ไม่ได้MonadLoggerตามคำแนะนำ คุณลองทำอะไรแล้วเกิดอะไรขึ้น?


ฉันจำไม่ได้ว่าฉันพยายามอะไรไปMonadLoggerบ้าง มันค่อนข้างนานแล้ว
Tom Ellis

คุณบังเอิญมีโครงการทดสอบเพื่อดูว่าtoRawSqlใช้ได้กับกรณีการใช้งานของคำถามนี้หรือไม่? ฉันตั้งค่าesqueletoสภาพแวดล้อมเพื่อทดลองใช้งาน แต่ฉันไม่มีเวลาคิดหาpersistentและเครื่องจักรอื่น ๆ ทั้งหมดที่จะสร้างและใช้แบบสอบถามจริง
Christian Conkle

ฉันไม่มีสภาพแวดล้อมการทดสอบหรือโครงการ esqueleto ใด ๆ เลยขออภัย
Tom Ellis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.