sql - para - manual de programacion android pdf
Manejo de tipos de lista con Esqueleto (1)
Tengo tipos de datos definidos como:
data ComitteeView = CommitteeView { committeeId :: CommitteeId
, committeeMembers :: [Person]
}
data CommitteesView = CommitteesView { committeeView :: [CommitteeView] }
Ahora, tal como está, tengo un modelo persistente definido como:
Person
name Text
Committee
name Text
CommitteePerson
personId PersonId
committeeId CommitteeId
Puedo crear fácilmente una consulta para rellenar un CommitteeView, usando Esqueleto. Sería algo como esto:
getCommitteeView cid =
CommitteeView <$> runDB $
select $
from (person `InnerJoin` pxc `InnerJoin` committee) -> do
on (committee ^. CommitteeId ==. pxc ^. CommitteePersonCommitteeId)
on (person ^. PersonId ==. pxc ^. CommitteePersonPersonId)
where_ (committee ^. CommitteePersonCommitteeId ==. val cid)
return person
Ahora, considere el problema de poblar CommitteesView
. En principio, obtenemos datos suficientes para poblar ejecutando subconsulta en la consulta anterior. De acuerdo, es suficiente. Ahora, ¿cómo puedo usar "group by Haskell-list" como group by
en SQL? ¿Cómo puedo doblar filas para poder terminar con una lista de personas?
Me da la impresión de que esqueleto
no puede manejar el caso como tal (es decir, no tiene un combinador que lo haga). Y mi base de datos subyacente obviamente no admite las listas de Haskell como columna. Pero, seguramente, no puedo ser la única persona que enfrenta este problema. ¿Qué es una estrategia efectiva? ¿Plegando una n-lista de listas en una n-lista? ¿O ejecuta n+1
consultas? ¿Hay más opciones?
¡Esqueleto NO está destinado a manejar listas de sublistas (listas multidimensionales) listas para usar! Data.List.groupBy
que ''cdk'' le aconsejó que solo pueda agrupar la lista, pero no lo que estaba pidiendo.
Para su caso, le aconsejaría insistentemente que utilice las consultas clásicas de SQL. Puedes ejecutar n + 1 consultas, pero hazlo solo si es una función rara y poco usable, por ejemplo, si preparas datos almacenados en caché (en función de los nombres de tus variables, supongo que puede que no sea demasiado utilizado y vale la pena intentarlo). Para un uso intensivo, debería considerar el uso de SQL clásico sin ninguna duda.
Si va a https://github.com/prowdsponsor/esqueleto , encontrará que:
No todas las características de SQL están disponibles, pero la mayoría de ellas se pueden agregar fácilmente (especialmente funciones).
para que pueda intentar solicitar una nueva característica. ¡Buena suerte!