2011-12-26 22 views
36

से आईडी द्वारा डेटाबेस इकाई प्राप्त करना मैं हास्केल और यसोड दोनों के लिए नया हूं, और एक साधारण वेब एप्लिकेशन बनाने की कोशिश कर रहा हूं जो बाहरी एपीआई से प्रश्नों का उत्तर दे सकता है। मैंने एक पार्सर (पैरासेक का उपयोग करके) बनाया है, जो मुझे एक ऐसी इकाई का आईडी प्राप्त करता है जिसे मैं नियमित रूप से इंट मान के रूप में लोड करना चाहता हूं।यसोड: एक आईडी

हालांकि, मैं अपने जीवन के लिए यह समझ नहीं सकता कि इस इंट को get स्वीकार करने के लिए कैसे स्वीकार किया जाएगा (i। E। Key (?))। प्रलेखन में सभी उदाहरण केवल पिछले आवेषण से आईडी या यूआरएल प्रेषण से प्राप्त करते हैं।

किसी भी मदद की बहुत सराहना की जाएगी जा के बाद से मैं अटक लग रहे ... :)

+4

ठीक है का उपयोग करने का एक उदाहरण है, मैं इस पता लगा #yesod पर अच्छा लोगों के लिए धन्यवाद: एक इंट से एक चाबी बनाने के लिए, 'मैं ', (या Int64, इस मामले में) और डेटाबेस बैकएंड के लिए, वाक्यविन्यास 'कुंजी $ PersistInt64 i' है। यह कुंजी बनाएगा, और संकलक यह पता लगाएगा कि किस इकाई को संदर्भ से प्राप्त करना है (यानी कुंजी के उपयोग से संबंधित जानकारी टाइप करें)। –

+4

अपने खुद के प्रश्न का जवाब देने के लिए स्वतंत्र महसूस करें ताकि यह बंद हो। – dflemstr

उत्तर

27

भले ही उत्तर पहले ही टिप्पणियों में पाया जा सके, मैं एक पूरा उदाहरण देना चाहता हूं।

मान लिया जाये कि हम एक Person मॉडल है, निम्नलिखित समारोह (यदि वह मौजूद है) की गई ID वाला persion के लिए एक रिकॉर्ड रिटर्न:

import Database.Persist.Types (PersistValue(PersistInt64)) 

getByIntId :: Integral i => i -> Handler (Maybe Person) 
getByIntId i = runDB $ get $ Key $ PersistInt64 (fromIntegral i) 

import की जरूरत है हम में से जारी रहती है-संस्करण का निर्माण करने देने के लिए पूर्णांक। fromIntegral अपेक्षित प्रकार Int64 पर किसी भी पूर्णांक को परिवर्तित करता है।

अद्यतन: Yesod के बाद से 1.2 PersistValue मॉड्यूल Database.Persist.Types में रहता है, 1.2 से पहले ही Database.Persist.Store (API Documentation) था।

अद्यतन 2: लगातार 2.0.2 के बाद से वहाँ दो निर्माण में कार्य/से परिवर्तित करने के लिए डेटाबेस चाबियाँ करने के लिए कर रहे हैं: toSqlKey और fromSqlKey (API Documentation)।

5

PersistInt64 यहाँ है: Database.Persist.Types

पहले PersistInt64 यहां था: Database.Persist.Store

1

कितना toSqlKey (लगातार 2.0.2)

share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase| 
Users 
    email String 
    password String 
    alias String 
    deriving Show 
|] 

connStr = "host=localhost dbname=communis_db user=communis password=develpass port=5432" 

inBackend :: ReaderT SqlBackend (NoLoggingT (ResourceT IO)) a-> IO a 
inBackend action = runStderrLoggingT $ withPostgresqlPool connStr 10 $ \pool -> liftIO $ do 
    flip runSqlPersistMPool pool $ do 
    runMigration migrateAll 
    action 

toUserId :: Int64 -> UsersId 
toUserId = toSqlKey 

get_user :: Int64 -> IO (Maybe Users) 
get_user = inBackend . get . toUserId 

delete_user :: Int64 -> IO() 
delete_user = inBackend . delete . toUserId