sql >> Databasteknik >  >> RDS >> Mysql

Hur man konverterar SQL skalär subquery till SQLAlchemy expression

Använd 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)

Använder as_scalar() begränsar returnerade kolumner och rader till 1, så du kan inte få hela modellobjektet med det (som query(PropertyValuation) är ett urval av alla attribut för PropertyValuation ), men får bara värderingen attribut fungerar.

Det finns ingen anledning att passera det senare. Ditt nuvarande sätt att deklarera underfrågan är bra som det är, eftersom SQLAlchemy kan korrelera automatiskt FROM-objekt till de för en omslutande fråga . Jag försökte skapa modeller som i viss mån representerar vad du har, och så här fungerar frågan ovan (med tillagda radbrytningar och indrag för läsbarhet):

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. Stoppa (lång) körning av SQL-fråga i PostgreSQL när session eller begäranden inte längre existerar?

  2. Vilka tecken är faktiskt kapabla att orsaka SQL-injektion i MySQL?

  3. Hur man formaterar negativa värden med parenteser i SQL Server (T-SQL)

  4. Vad är skillnaden mellan utf8_unicode_ci och utf8_unicode_520_ci