How to fetch entity by `Int` when a `Key` is expected in the Haskell persistent library?
Asked Answered
C

1

10

I use Persistent orm with scotty web framework.

I want to get value from db by id. These id are coming to me from GET request

There are "get" function that takes "Key Entity" variable and returns "Maybe Entity".

I use following code to get value from db

k <- keyFromValues $ [(PersistInt64 myOwnIntVarFromRequest)]
case k of
    Left _ -> {-some processing-}
    Right x -> do
    t <- liftIO . runDb $ get (x::Key Post) --Post is one of my models
    case t of
        Nothing -> {-processing-}
        Just x -> {-processing-}

These code is extremly ugly. But i don't know how to do it better

So my question is how obtain variable of type "Key Entity" without calling keyFromValues.

PS Sorry for my poor English

Christmas answered 21/1, 2015 at 13:27 Comment(0)
R
16

You can use toSqlKey for that.

Rumal answered 22/1, 2015 at 1:25 Comment(4)
@michael-snoyman: What if the key has some type other than Int64?Payer
I'm actually not familiar with the more flexible primary key mechanism in persistent, so I can't advise on how to handle that case.Rumal
For the next person googling: the quasiquoter creates a declaration of the form newtype Key TypeName = TypeNameKey {unTypeNameKey :: Int32 } from the quote persistLowerCase| TypeName Id Int32Lederman
@snøreven You can actually just use the constructor. If you have an entity named Company, then constructing a key for this entity from some integer n is a case of doing CompanyKey n.Betray

© 2022 - 2024 — McMap. All rights reserved.