sql >> Databáze >  >> RDS >> Mysql

Jak převést skalární poddotaz SQL na výraz SQLAlchemy

Použijte as_scalar() nebo 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)

Pomocí as_scalar() omezuje vrácené sloupce a řádky na 1, takže pomocí něj nemůžete získat celý objekt modelu (jako query(PropertyValuation) je výběr ze všech atributů PropertyValuation ), ale získáte pouze hodnocení atribut funguje.

Není třeba to předávat později. Váš současný způsob deklarování poddotazu je v pořádku, protože SQLAlchemy může automaticky korelují objekty FROM s objekty vloženého dotazu . Pokusil jsem se vytvořit modely, které trochu reprezentují to, co máte, a takto funguje výše uvedený dotaz (s přidanými zalomeními řádků a odsazením pro čitelnost):

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. Jak zjistit dotaz, který drží zámek v Postgres?

  2. Jak spravujete SQL dotazy

  3. Nezachycená výjimka 'PDOException' zpráva 'neplatný název zdroje dat'

  4. App Engine a MySQL