Próbuję odtworzyć ten (postgresql) SQL w sqlalchemy:

SELECT MAX(building.id) FROM building JOIN owner ON building.owner_id = owner.id WHERE owner.name IN ('rita', 'sue', 'bob') GROUP BY version.name;

W ten sposób znajduje się jeden budynek (najnowszy), który należy do każdego z wymienionych właścicieli (uwaga: dane zmienione w celu ochrony niewinnych: bardziej sensowne jest, dlaczego robię to w prawdziwym kontekście, obiecuję).

Jestem trochę sqlalchemy n00b i nie mogę wymyślić, jak to zrobić w sqlalchemy. Oto, co obecnie mam:

subquery = db.query(func.max(model.Building.id))
subquery = subquery.filter(model.Building.owner.has(model.Owner.name.in_(names)))
subquery = subquery.group_by(model.Owner.name)
print(subquery.all())

Raporty:

ProgrammingError: (psycopg2.errors.UndefinedTable) missing FROM-clause entry for table "owner"

Czego tu brakuje?

0
spookypeanut 20 listopad 2019, 19:06

1 odpowiedź

Najlepsza odpowiedź

Rozumiem! Brakowało mi odpowiednika połączenia. Ten kod działa:

subquery = db.query(func.max(model.Building.id))
subquery = subquery.filter(model.Building.owner_id==model.Owner.id)
subquery = subquery.filter(model.Building.owner.has(model.Owner.name.in_(names)))
subquery = subquery.group_by(model.Owner.name)
print(subquery.all())
0
spookypeanut 20 listopad 2019, 19:31
Można również utworzyć sprzężenie dokładnie tak, jak było, zamiast używać EXISTS i sprzężenia sprzed SQL-92: db.query(...).join(model.Building.owner).filter(model.Owner.name.in_(names)).group_by(model.Owner.name)
 – 
Ilja Everilä
21 listopad 2019, 09:35