sql >> Database teknologi >  >> RDS >> Mysql

Sådan konverteres SQL skalær underforespørgsel til SQLAlchemy-udtryk

Brug as_scalar() , eller label() :

subquery = (
    session.query(PropertyValuation.valuation)
    .filter(PropertyValuation.zip_code == Property.address_zip)
    .order_by(func.abs(func.datediff(PropertyValuation.as_of, Sale.date_sold)))
    .limit(1)
)

query = session.query(Sale.agent_id,
                      Sale.property_id,
                      Property.address_zip,
                      # `subquery.as_scalar()` or
                      subquery.label('back_valuation'))\
        .join(Property)

Brug af as_scalar() begrænser returnerede kolonner og rækker til 1, så du ikke kan få hele modelobjektet ved at bruge det (som query(PropertyValuation) er et udvalg af alle attributterne for PropertyValuation ), men får kun vurderingen attribut virker.

Der er ingen grund til at videregive det senere. Din nuværende måde at erklære underforespørgslen på er fin, som den er, da SQLAlchemy kan korrelerer automatisk FROM-objekter til dem i en omsluttende forespørgsel . Jeg prøvede at skabe modeller, der i nogen grad repræsenterer det, du har, og her er, hvordan forespørgslen ovenfor fungerer (med tilføjede linjeskift og indrykning for at kunne læse den):

In [10]: print(query)
SELECT sale.agent_id AS sale_agent_id,
       sale.property_id AS sale_property_id,
       property.address_zip AS property_address_zip,
       (SELECT property_valuations.valuation
        FROM property_valuations 
        WHERE property_valuations.zip_code = property.address_zip
        ORDER BY abs(datediff(property_valuations.as_of, sale.date_sold))
        LIMIT ? OFFSET ?) AS back_valuation 
FROM sale
JOIN property ON property.id = sale.property_id



  1. MySQL viser resultaterne i alfabetisk rækkefølge, men viser et bestemt element før den alfabetisk sorterede liste

  2. Håndtering af MySQL langvarige forespørgsler

  3. MySQL bruger ikke indeks til ORDER BY

  4. Unity3D-forbindelse til MySQL-fejl