मैं मॉड्यूलर तरीके से Database.Esqueleto क्वेरी कैसे लिख सकता हूं जैसे कि "आधार" क्वेरी और संबंधित परिणाम सेट को परिभाषित करने के बाद, मैं अतिरिक्त आंतरिक जोड़ों को जोड़कर परिणाम सेट को प्रतिबंधित कर सकता हूं और जहां अभिव्यक्तियां।डाटाबेस लिखना। प्रश्न पूछना, सशर्त जुड़ना और गिनती
इसके अलावा, मैं मूल क्वेरी को कैसे परिवर्तित कर सकता हूं जो एक क्वेरी में इकाइयों (या फ़ील्ड टुपल्स) की एक सूची देता है जो परिणाम सेट की गणना करता है क्योंकि बेस क्वेरी निष्पादित नहीं होती है, लेकिन इसका एक संशोधित संस्करण LIMIT के साथ होता है और ऑफसेट।
the Yesod Book से अपनाए गए निम्नलिखित गलत हास्केल कोड स्निपेट को उम्मीद है कि मैं क्या लक्ष्य कर रहा हूं।
{-# LANGUAGE QuasiQuotes, TemplateHaskell, TypeFamilies, OverloadedStrings #-}
{-# LANGUAGE GADTs, FlexibleContexts #-}
import qualified Database.Persist as P
import qualified Database.Persist.Sqlite as PS
import Database.Persist.TH
import Control.Monad.IO.Class (liftIO)
import Data.Conduit
import Control.Monad.Logger
import Database.Esqueleto
import Control.Applicative
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
Person
name String
age Int Maybe
deriving Show
BlogPost
title String
authorId PersonId
deriving Show
Comment
comment String
blogPostId BlogPostId
|]
main :: IO()
main = runStdoutLoggingT $ runResourceT $ PS.withSqliteConn ":memory:" $ PS.runSqlConn $ do
runMigration migrateAll
johnId <- P.insert $ Person "John Doe" $ Just 35
janeId <- P.insert $ Person "Jane Doe" Nothing
jackId <- P.insert $ Person "Jack Black" $ Just 45
jillId <- P.insert $ Person "Jill Black" Nothing
blogPostId <- P.insert $ BlogPost "My fr1st p0st" johnId
P.insert $ BlogPost "One more for good measure" johnId
P.insert $ BlogPost "Jane's" janeId
P.insert $ Comment "great!" blogPostId
let baseQuery = select $ from $ \(p `InnerJoin` b) -> do
on (p ^. PersonId ==. b ^. BlogPostAuthorId)
where_ (p ^. PersonName `like` (val "J%"))
return (p,b)
-- Does not compile
let baseQueryLimited = (,) <$> baseQuery <*> (limit 2)
-- Does not compile
let countingQuery = (,) <$> baseQuery <*> (return countRows)
-- Results in invalid SQL
let commentsQuery = (,) <$> baseQuery
<*> (select $ from $ \(b `InnerJoin` c) -> do
on (b ^. BlogPostId ==. c ^. CommentBlogPostId)
return())
somePosts <- baseQueryLimited
count <- countingQuery
withComments <- commentsQuery
liftIO $ print somePosts
liftIO $ print ((head count) :: Value Int)
liftIO $ print withComments
return()
अंतराल को भरने और एक निर्णायक उत्तर प्रदान करने के लिए धन्यवाद। – Tero
मुझे यह भी ध्यान रखना चाहिए कि 'commentsQuery' में आप' ठीक 'का उपयोग करने से पहले 'baseQuery' का भी उपयोग कर सकते हैं। –
इसके अलावा, कृपया किसी भी एस्क्यूलेट क्वेरी के बग के रूप में रिपोर्ट करें जिसके परिणामस्वरूप अमान्य एसक्यूएल है ताकि हम इसकी जड़ों की जांच कर सकें। जिसे आपने देखा है उसे '() ', ज्ञात-लेकिन-निश्चित-निश्चित बग के उपचार के साथ करना है।कामकाज के रूप में आप कुछ ऐसा कर सकते हैं जैसे 'रिटर्न (वैल ट्रू)'। –