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?
1 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())
Podobne pytania
Nowe pytania
python
Python to wielozadaniowy, wielozadaniowy język programowania dynamicznie typowany. Został zaprojektowany tak, aby był szybki do nauczenia się, zrozumienia i użycia oraz wymuszania czystej i jednolitej składni. Należy pamiętać, że Python 2 oficjalnie nie jest obsługiwany od 01-01-2020. Mimo to, w przypadku pytań Pythona specyficznych dla wersji, dodaj znacznik [python-2.7] lub [python-3.x]. Korzystając z wariantu Pythona (np. Jython, PyPy) lub biblioteki (np. Pandas i NumPy), należy umieścić go w tagach.
EXISTS
i sprzężenia sprzed SQL-92:db.query(...).join(model.Building.owner).filter(model.Owner.name.in_(names)).group_by(model.Owner.name)