繁体   English   中英

尝试将 SQL 查询转换为 SQLAlchemy 查询

[英]Trying to Convert SQL query to SQLAlchemy query

我正在尝试将原始 SQL 转换为 sqlalchemy 查询,但到目前为止我得到了不同的结果。 我从尝试 sqlalchemy 中得到的结果是缺少 Property 对象(我得到了一个带有 (ListingCalendarDays, None, PricingData) 的元组),所以我认为翻译中缺少一些东西。

原始查询:

   result = session.execute("""SELECT p.id as property_id,
           p.home_code,
           c.listing_id,
           c.calendar_date,
           c.available,
           ab.price
        FROM listing_calendar_days c
        LEFT JOIN properties p
            ON (p.id::integer = c.listing_id and p.id is not null and p.id <> '')
        LEFT JOIN pricing_data ab
            ON c.listing_id = ab.listing_id
            AND c.calendar_date = ab.price_date
        WHERE c.calendar_date >= '%s'
        AND c.calendar_date <= '%s' ;""" % ( now.isoformat(), end.isoformat()))

我的尝试:

query = (session.query( ListingCalendarDays, Properties, PricingData )
            .outerjoin(Properties,
                and_(Properties.id == str(ListingCalendarDays.listing_id),
                     Properties.id != None))
            .outerjoin(PricingData,
                and_(ListingCalendarDays.listing_id == PricingData.listing_id,
                     ListingCalendarDays.calendar_date == PricingData.price_date))
            .filter(ListingCalendarDays.calendar_date.between( now, end )))

result = query.all()

您可以通过执行以下操作打印出 SQLAlchemy 生成的查询

print(query)

在这种特殊情况下,您的Properties连接条件是错误的。 str(ListingCalendarDays.listing_id)生成文字字符串"ListingCalendarDays.listing_id" ,而不是转换为varchar的列listing_id 对于演员表,您需要cast()构造:

cast(ListingCalendarDays.listing_id, String)

此外,您还缺少p.id <> ''条件。

把它们放在一起:

and_(Properties.id == cast(ListingCalendarDays.listing_id, String),
     Properties.id != None,
     Properties.id != "")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM