class Person(Base):
__tablename__ = "stanovnik"
id = Column(Integer, primary_key=True)
ime = Column(String(20))
prezime = Column(String(50))
nadimak=Column(String(50),nullable=True)
spol = Column(String(5))
ratni_staz = Column(Integer)
godine = Column(Integer)
broj_clanova=Column(Integer,nullable=True)
sifra_adr = Column(Integer,ForeignKey('adresa.sifra_adrese'))
sifra_part = Column(Integer,ForeignKey('stanovnik.id'),nullable=True)
sifra_ost = Column(Integer,ForeignKey('ostali.sifra_ostali'),nullable=True)
adrese=relationship('Address')
class Address(Base):
__tablename__ = "adresa"
sifra_adrese=Column(Integer(),primary_key=True)
naziv_adrese=Column(String(25))
sifra_mje=Column(Integer(),ForeignKey('mjesto.sifra_mjesta'))
mjesto=relationship('Village')
唯一的问题是 SQLAlchemy 中的相关子查询,因为在线帮助代码很难,而且 chatgpt 在这种情况下不起作用。
SQL代码为
SELECT id, ime, prezime, ratni_staz
FROM stanovnik s, adresa a1
WHERE s.sifra_adr = a1.sifra_adrese
AND ratni_staz > (SELECT AVG(ratni_staz)
FROM stanovnik s, a2.sifra_adrese
WHERE s.sifra_adr = a2.sifra_adrese
AND a1.sifra_adrese = a2.sifra_adrese)
有助于解决这个相关子查询。
需要在select中解决这两个表的简单关联子查询
SQLAlchemy 将尝试“自动关联”子查询和父查询之间的匹配表,但这在这里不起作用,因为我们只想关联地址。所以你必须用
correlate
指定它。我想这就是你想要的,但也许我不完全理解你的子查询目标。
with Session(engine) as session, session.begin():
# Subquery should be a single scalar: .scalar_subquery()
# Correlate on Address (ie. compute average across all Persons at each address): .correlate(Address)
subq = select(func.avg(Person.ratni_staz)).where(Person.address_id == Address.id).scalar_subquery().correlate(Address)
q = select(Person, Address).where(Person.address_id == Address.id, Person.ratni_staz > subq)
for person, address in session.execute(q):
print (person, address)
关联标量子查询的文档在这里: 标量和相关子查询