sql >> データベース >  >> RDS >> Mysql

SQLスカラーサブクエリをSQLAlchemy式に変換する方法

    as_scalar() 、または 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)
    

    as_scalar()の使用 返される列と行を1に制限するため、それを使用してモデルオブジェクト全体を取得することはできません(query(PropertyValuation)として) PropertyValuationのすべての属性の選択です )、ただし評価のみを取得する 属性は機能します。

    後で渡す必要はありません。 SQLAlchemyはFROMオブジェクトを囲んでいるクエリのオブジェクトに自動的に関連付けます 。私はあなたが持っているものをいくらか表すモデルを作成しようとしました、そしてこれが上記のクエリがどのように機能するかです(読みやすさのために改行とインデントが追加されています):

    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. 1つのテーブル、2つの列のMYSQLクエリチャレンジ

    2. 独自のアプリにphpMyAdminをインストールする方法

    3. 複数の値に一致するレコードのグループを検索します

    4. MySQL結合を簡単な言語で説明してください