[英]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.