python sql sqlalchemy greatest-n-per-group

python - Uniéndose a una subconsulta en SQLAlchemy



greatest-n-per-group (1)

Aparentemente necesita agregar un and_() alrededor de múltiples condiciones de unión.

join( sq, and_(p1.Name==sq.c.Name, p1.Arch==sq.c.Arch, d1.repo==sq.c.repo, p1.Date==sq.c.Date))./

Tengo la siguiente consulta SQL (es la más grande de una determinada columna por grupo, con 3 cosas por las que agrupar):

select p1.Name, p1.nvr, p1.Arch, d1.repo, p1.Date from Packages as p1 inner join Distribution as d1 on p1.rpm_id = d1.rpm_id inner join ( select Name, Arch, repo, max(Date) as Date from Packages inner join Distribution on Packages.rpm_id = Distribution.rpm_id where Name like ''p%'' and repo not like ''%staging'' group by Name, Arch, repo ) as sq on p1.Name = sq.Name and p1.Arch = sq.Arch and d1.repo = sq.repo and p1.Date = sq.Date order by p1.nvr

Y estoy tratando de convertirlo a SQLAlchemy. Esto es lo que tengo hasta ahora:

p1 = aliased(Packages) d1 = aliased(Distribution) sq = session./ query( Packages.Name, Packages.Arch, Distribution.repo, func.max(Packages.Date)./ label(''Date''))./ select_from( Packages)./ join( Distribution)./ filter( queryfilter)./ filter( not_(Distribution.repo./ like(''%staging'')))./ group_by( Packages.Name, Packages.Arch, Distribution.repo).subquery() result = session./ query( p1, d1.repo)./ select_from( p1)./ join( d1)./ join( sq, p1.Name==sq.c.Name, p1.Arch==sq.c.Arch, d1.repo==sq.c.repo, p1.Date==sq.c.Date)./ order_by(p1.nvr).all()

El problema surge cuando hago la unión en la subconsulta. Recibo un error que indica que no hay una cláusula from para la cual unirse. Esto es extraño porque especifico uno justo después de la subconsulta en la función de unión como argumento. ¿Alguna idea de lo que estoy haciendo mal? ¿Quizás necesito alias algo y hacer una selección de nuevo?

EDITAR: error exacto

Could not find a FROM clause to join from. Tried joining to SELECT "Packages"."Name", "Packages"."Arch", "Distribution".repo, max("Packages"."Date") AS "Date" FROM "Packages" JOIN "Distribution" ON "Packages".rpm_id = "Distribution".rpm_id WHERE "Packages"."Name" LIKE :Name_1 AND "Distribution".repo NOT LIKE :repo_1 GROUP BY "Packages"."Name", "Packages"."Arch", "Distribution".repo, but got: Can''t find any foreign key relationships between ''Join object on %(139953254400272 Packages)s(139953254400272) and %(139953256322768 Distribution)s(139953256322768)'' and ''%(139953257005520 anon)s''.

Está intentando unirse, pero dice que no sabe dónde hacer la unión. ¿Hay algo mal con mi sintaxis? Creo que es correcto en función de lo que está en la función de unión.