Yesod: Getting a database entity by ID from an Int

后端 未结 3 2029
伪装坚强ぢ
伪装坚强ぢ 2020-12-14 07:00

I\'m new to both Haskell and Yesod, and am trying to build a simple web application that can answer queries from an external API. I have built a parser (using Parsec), that

相关标签:
3条回答
  • 2020-12-14 07:06

    PersistInt64 is here: Database.Persist.Types.

    Previously PersistInt64 was here: Database.Persist.Store.

    0 讨论(0)
  • 2020-12-14 07:10

    Just an example of how to use 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
    
    0 讨论(0)
  • 2020-12-14 07:25

    Even if the answer can already be found in the comments, I would like to give a complete example.

    Assuming we have a Person Model, the following function returns a record for the persion with the given ID (if it exists):

    import Database.Persist.Types (PersistValue(PersistInt64))
    
    getByIntId :: Integral i => i -> Handler (Maybe Person)
    getByIntId i = runDB $ get $ Key $ PersistInt64 (fromIntegral i)
    

    The import is needed to let us construct the persist-version of an integer. fromIntegral converts any integer to the expected type Int64.

    Update: Since Yesod 1.2 PersistValue lives in the module Database.Persist.Types, before 1.2 it was Database.Persist.Store (API Documentation).

    Update 2: Since Persistent 2.0.2 there are two build-in functions to convert from/to database keys: toSqlKey and fromSqlKey (API Documentation, see answer by hhefesto for an example).

    0 讨论(0)
提交回复
热议问题