una resueltos relacion modelo logico libro fisico extendido entidad empresa ejercicios ejemplos diseƱo diagrama datos haskell persistence yesod

haskell - resueltos - modelo entidad relacion ejemplos



Yesod: Obtener una entidad de base de datos por ID desde un Int (3)

Soy nuevo para Haskell y Yesod, y estoy tratando de construir una aplicación web simple que pueda responder consultas desde una API externa. He creado un analizador (usando Parsec), que me proporciona el ID de una entidad que quiero cargar como un valor Int normal.

Sin embargo, yo por mi vida no puedo entender cómo convertir este Int en algo que get aceptar (es decir, una Key (?)). Todos los ejemplos en la documentación solo obtienen el ID de las inserciones previas o del despacho de la url.

Cualquier ayuda sería muy apreciada, ya que parece estar atascado ... :)


Incluso si la respuesta ya se puede encontrar en los comentarios, me gustaría dar un ejemplo completo.

Suponiendo que tenemos un Modelo de Person , la siguiente función devuelve un registro para la persion con la ID dada (si existe):

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

La import es necesaria para permitirnos construir la versión persistente de un entero. fromIntegral convierte cualquier número entero al tipo esperado Int64 .

Actualización : Dado que Yesod 1.2 PersistValue vive en el módulo Database.Persist.Types , antes 1.2 era Database.Persist.Store ( API Documentation ).

Actualización 2 : desde Persistent 2.0.2 hay dos funciones integradas para convertir de / a las claves de la base de datos: toSqlKey y fromSqlKey ( documentación de la API ).


Solo un ejemplo de cómo usar 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


PersistInt64 está aquí: Database.Persist.Types .

Anteriormente, PersistInt64 estaba aquí: Database.Persist.Store .