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
.