2011-12-26 22 views
36

Tôi mới dùng cả Haskell và Yesod và đang cố xây dựng một ứng dụng web đơn giản có thể trả lời các truy vấn từ một API bên ngoài. Tôi đã xây dựng một trình phân tích cú pháp (bằng cách sử dụng Parsec), nó cho tôi ID của thực thể mà tôi muốn tải dưới dạng giá trị Int thông thường.Yesod: Bắt một thực thể cơ sở dữ liệu theo ID từ một Int

Tuy nhiên, tôi cho cuộc sống của tôi không thể tìm ra cách biến Int này thành thứ gì đó mà get sẽ chấp nhận (i. E. Key (?)). Tất cả các ví dụ trong tài liệu chỉ nhận được id từ các lần chèn trước đó hoặc từ công văn url.

Bất kỳ trợ giúp sẽ được đánh giá rất nhiều, kể từ khi tôi dường như bị mắc kẹt ... :)

+4

Được rồi, tôi figured này ra nhờ có những người đẹp trên #yesod: Để tạo một khóa từ một Int, 'i ', (hoặc Int64, trong trường hợp này) và cho một backend cơ sở dữ liệu, cú pháp là' Key $ PersistInt64 i'. Điều này sẽ tạo ra khóa và trình biên dịch sẽ tìm ra thực thể nào cần lấy từ ngữ cảnh (tức là nhập thông tin liên quan đến việc sử dụng khóa). –

+4

Vui lòng trả lời câu hỏi của riêng bạn để câu hỏi được đóng lại. – dflemstr

Trả lời

27

Ngay cả khi câu trả lời có thể đã được tìm thấy trong các nhận xét, tôi muốn đưa ra một ví dụ hoàn chỉnh.

Giả sử chúng ta có một mẫu Person, hàm sau trả về một kỷ lục cho persion với ID nhất định (nếu nó tồn tại):

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

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

Các import là cần thiết để chúng ta xây dựng kiên trì-phiên bản của một số nguyên. fromIntegral chuyển đổi bất kỳ số nguyên nào thành loại mong đợi Int64.

Cập nhật: Kể từ Yesod 1.2 PersistValue cuộc sống trong module Database.Persist.Types, trước 1.2 đó là Database.Persist.Store (API Documentation).

Cập nhật 2: Kể từ khi dai dẳng 2.0.2 có hai xây dựng-in chức năng để chuyển đổi từ/đến các phím cơ sở dữ liệu: toSqlKeyfromSqlKey (API Documentation).

5

PersistInt64 là ở đây: Database.Persist.Types.

Trước đây PersistInt64 đã ở đây: Database.Persist.Store.

1

Chỉ cần một ví dụ về cách sử dụng toSqlKey (Persistent 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 
Các vấn đề liên quan