Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana mengonversi subquery skalar SQL ke ekspresi SQLAlchemy

Gunakan as_scalar() , atau 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)

Menggunakan as_scalar() membatasi kolom dan baris yang dikembalikan menjadi 1, jadi Anda tidak dapat menggunakan seluruh objek model (sebagai query(PropertyValuation) adalah pilihan dari semua atribut PropertyValuation ), tetapi hanya mendapatkan penilaian atribut berfungsi.

Tidak perlu melewatinya nanti. Cara Anda saat ini untuk mendeklarasikan subquery baik-baik saja, karena SQLAlchemy dapat secara otomatis mengkorelasikan objek FROM dengan objek kueri terlampir . Saya mencoba membuat model yang agak mewakili apa yang Anda miliki, dan inilah cara kueri di atas bekerja (dengan tambahan jeda baris dan lekukan agar mudah dibaca):

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Gunakan Database Relasional MySQL di Fedora 14

  2. Kompilasi Masalah dengan MySQL C API pada MAC OS X 10.6

  3. Mengaktifkan mikrodetik di Symfony2 (Doktrin) dan MySQL

  4. Mysql AVG untuk mengabaikan nol

  5. Masukkan data menggunakan array multidimensi dari berbagai bidang