2015-07-03 9 views
5

मैं एक डेटाबेस मॉडल है, इसलिएएक स्थायी इकाई के साथ डेटाबेस इकाई की आईडी कैसे प्राप्त करें?

import   Database.Persist.TH (mkPersist, persistUpperCase, 
            share, sqlSettings) 

share [mkPersist sqlSettings] [persistUpperCase| 
Foo 
    field1 Int 
    field2 Bool 
|] 

की तरह लगातार उपयोग करते हुए और मैं डेटाबेस से एक वस्तु foo :: Foo प्राप्त करने में सक्षम हूँ। मैं fooField1 foo :: Int और fooField2 foo :: Bool के साथ फ़ील्ड तक पहुंच सकता हूं। और क्योंकि मैं sqlSettings का उपयोग करता हूं, मुझे पता है कि Int64 है- प्रत्येक इकाई के साथ संग्रहीत "आईडी" डेटाबेस कुंजी का प्रतिनिधित्व। जैसे जब मैं get . toSqlKey :: Int64 -> ...

मेरे foo :: Foo को देखते हुए, मुझे id :: Int64 कैसे प्राप्त हो सकता है?

उत्तर

5

Foo अपने पास एक आईडी नहीं है, क्योंकि Foos डेटाबेस के बाहर मौजूद हो सकता है (वे लिखे जाने से पहले)। यही कारण है कि उदाहरण के लिए एक चुनिंदा ऑपरेशन आपको एंटिटी की एक सूची देता है, जिसमें कुंजी और ऑब्जेक्ट दोनों शामिल होते हैं।

http://hackage.haskell.org/package/persistent-2.2/docs/Database-Persist-Types.html#t:Entity

उदाहरण के लिए देखें, एक प्राथमिक कुंजी बाधा से प्राप्त करने में कठिनाई पर Yesod पुस्तक (http://www.yesodweb.com/book/persistent) देखें:

personId <- insert $ Person "Michael" "Snoyman" 26 
maybePerson <- getBy $ PersonName "Michael" "Snoyman" 
case maybePerson of 
    Nothing -> liftIO $ putStrLn "Just kidding, not really there" 
    Just (Entity personId person) -> liftIO $ print person 

getBy की वापसी प्रकार एक इकाई की दोनों प्रमुख लपेटकर है (personId) और मूल्य (person)।

+0

यदि मैं 'getBy' का उपयोग नहीं करता लेकिन उदा। एक एस्क्यूलेटो क्वेरी, मैं आमतौर पर 'entityVal' का उपयोग करता हूं और आईडी छोड़ देता हूं ... मैंने अभी ध्यान नहीं दिया। –

+3

पूर्णता के लिए: 'सेक्लेकी। entityKey :: इकाई रिकॉर्ड -> डेटाबेस से पुनर्प्राप्त एक इकाई पर Int64' (उदा। 'इकाई foo') आईडी देता है। –

संबंधित मुद्दे