[Python-es] SqlAlchemy, no consigo hacer un join
Ricardo Cárdenes
ricardo.cardenes en gmail.com
Lun Mar 7 15:15:44 EST 2016
¿Por qué no te permiten las tuplas concatenar? :-? Ya puestos, yo lo
pondría así:
query = (
session.query(movimientos)
.filter(movimientos.fecha >= d1, movimientos.fecha <= d2)
.filter(movimientos.id_almacen == almId)
)
if en.isdigit():
query = query.filter(movimientos.id_entidad == en)
elif articulo.isdigit():
query = query.filter(movimientos.id_articulo == articulo)
else:
query = query.filter(movimientos.tipo.like(tpn))
mov = query.all()
pero es preferencia personal...
2016-03-07 7:59 GMT-10:00 kausdiv <kausdiv en gmail.com>:
> Hola de nuevo.
>
> Me surge otra cuestión:
>
> en el buscador que estoy haciendo de movimientos hay distintos controles y
> en función de lo que busques se genera un filtro u otro:
>
> # Filtro, estado inicial, siempre hay fechas y id de almacen.
> filtro = (movimientos.fecha>= d1, movimientos.fecha<=d2, movimientos.id_almacen == almId, movimientos.tipo.like(tpn))
> if articulo.isdigit(): #movimientos de un artículo concreto.
> filtro = (movimientos.fecha>= d1, movimientos.fecha<=d2, movimientos.id_almacen == almId, movimientos.id_articulo == articulo)
> if en.isdigit():
> filtro = (movimientos.fecha>= d1, movimientos.fecha<=d2, movimientos.id_almacen == almId, movimientos.id_entidad == en)
>
> mov = session.query(movimientos).filter(*filtro).all()
>
>
> Esto no la mejor forma de hacerlo, pero no se otra. Estas tuplas no me
> permiten concatenar
>
> ¿ Como podría hacerse ?
>
> Había pensado como alternativa usar "Like" en cada campo como en el "tipo"
> que cuando son todos lleva "%" ¿ sería correcto usar este sistema ?
>
> Saludos.
>
> El 05/03/2016 a las 12:28, Ricardo Cárdenes escribió:
>
> Un JOIN normal hace exactamente eso: un cruce entre las dos tablas
> mostrando las filas donde hay coincidencias. Es lo que se llama "inner
> join" (una combinación interna). Lo que tú quieres es que se muestren todas
> las filas de una de las tablas que participan en la combinación y que, de
> la otra, aparezcan los datos que coinciden. Esto se denomina "outer join"
> (combinación externa). Las combinaciones externas las tienes de dos tipos,
> por la izquierda y por la derecha, dependiendo de qué tabla tenga que salir
> entera. Es decir:
>
> .... FROM articulos LEFT OUTER JOIN movimientos ...
>
> Obtendrá una nueva tabla donde aparecerán todas las filas de "artículos"
> (la tabla "por la izquierda") y también las filas de movimientos que
> correspondan. Para las filas de artículos sin movimientos, esas columnas
> aparecerán (normalmente) como valores nulos, no como 0. Eso te debería dará
> valores incorrectos para el sumatorio, porque NULL + valor numérico debería
> ser NULL. Una solución es usar, por ejemplo, la función COALESCE (es del
> estándar SQL y SQLite la soporta). Se usaría así:
>
> func.sum(func.coalesce(movimientos.uEntrada, 0))
>
> si no recuerdo mal. Lo que hace COALESCE es tomar una serie de valores y
> devolver el primero que no sea NULL. De esa manera, si movimientos.uEntrada
> es NULL, devolverá 0.
>
> Saludos,
> Ricardo
>
> 2016-03-04 23:25 GMT-10:00 kausdiv <kausdiv en gmail.com>:
>
>> ¡ Perfecto !
>>
>> Es eso. Pero tengo otro problema:
>>
>> Supón que tengo 5 artículos dados de alta, y solo 2 tienen movimientos.
>>
>> La consulta actual solo muestra los 2 que tienen movimientos.
>>
>> ¿ Como podría hacer que aparezcan los 5, y los que no tienen movimientos
>> que salgan a 0 las entras y salidas ?
>>
>> Saludos.
>>
>> El 05/03/2016 a las 6:46, Ricardo Cárdenes escribió:
>>
>>
>> session.query(articulos.id, articulos.nombre,
>> func.sum(movimientos.uEntrada).label('Entradas'),
>> func.sum(movimientos.uSalida).label('Salidas')).join(movimientos,
>> articulos).all()
>>
>>
>>
>> _______________________________________________
>> Python-es mailing list
>> Python-es en python.org
>> https://mail.python.org/mailman/listinfo/python-es
>> FAQ: http://python-es-faq.wikidot.com/
>>
>>
>
>
> _______________________________________________
> Python-es mailing listPython-es en python.orghttps://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
>
>
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> https://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20160307/a873803c/attachment.html>
Más información sobre la lista de distribución Python-es