मैं मेरे लिए एसक्यूएल स्ट्रिंग उत्पन्न करने के लिए एस्केलेटो कैसे प्राप्त कर सकता हूं?


86

मैं एक 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आवश्यक है। मेरा मानना ​​है कि, जैसा कि पर्यायवाची नाम से संकेत मिलता है IdentInfo, esqueletoक्वेरी में पहचानकर्ता बनाने के लिए इसका उपयोग करता है। उदाहरण के लिए, यह डेटाबेस का नाम जोड़ सकता है। मैंने वास्तव में स्रोत को पर्याप्त गहराई में नहीं गिराया है। यह कहने के लिए पर्याप्त है कि, एक नकली कनेक्शन पास करना (यानी undefined) काम नहीं करता है; मुझे नहीं पता कि क्या मॉक कनेक्शन लागू किया जा सकता है। आपका समाधान व्यावहारिक लगता है।

आपके बाकी समाधान ठीक काम करने चाहिए। चूंकि toRawSqlस्पष्ट रूप से एक आंतरिक कार्य है, इसलिए यहां एपीआई उचित है। हालांकि अन्य ध्यान दें कि यह कनेक्शन-न्यूट्रल स्ट्रिंग उत्पन्न करने के लिए "संभव" होना चाहिए, जो कि इसके दायरे से बाहर दिखाई देता है toRawSql

आप उल्लेख करते हैं कि आप MonadLoggerअनुशंसित के रूप में उपयोग नहीं कर सकते हैं । आपने क्या प्रयास किया, और क्या हुआ?


मुझे याद नहीं है कि मैंने MonadLoggerदुर्भाग्य से क्या कोशिश की थी । कुछ समय पहले यह काफी था।
टॉम एलिस

क्या आपके पास यह देखने के लिए कि क्या toRawSqlइस प्रश्न के उपयोग-मामले के लिए काम करता है, अब एक परीक्षण परियोजना का काम होगा ? मैंने esqueletoइसे आज़माने के लिए एक वातावरण स्थापित किया , लेकिन मेरे पास persistentवास्तव में एक वास्तविक क्वेरी बनाने और उपभोग करने के लिए यह पता लगाने का समय नहीं था ।
क्रिश्चियन कोंकले

मेरे पास किसी भी तरह का परीक्षण वातावरण या कोई भी एस्केलेटो परियोजना नहीं है, क्षमा करें।
टॉम एलिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.