我试图将原始SQL转换为sqlalchemy查询,但到目前为止,我得到了不同的结果。我从sqlalchemy尝试得到的结果是缺少Property对象(我得到了一个元组(ListingCalendarDays,None,PricingData)),所以我认为翻译中缺少一些东西。
原始查询:
<?xml version="1.0"?>
<config>
<modules>
<Company_OldWebUrlRedirect>
<version>0.1.0</version>
</Company_OldWebUrlRedirect>
</modules>
<frontend>
<routers>
<movie>
<use>standard</use>
<args>
<module>Company_OldWebUrlRedirect</module>
<frontName>movie</frontName>
</args>
</movie>
</routers>
</frontend>
<global>
<models>
<oldweburlredirect>
<class>Company_OldWebUrlRedirect_Model</class>
</oldweburlredirect>
</models>
<events>
<controller_action_predispatch>
<observers>
<company_oldweburlredirect>
<type>model</type>
<class>oldweburlredirect/observer</class>
<method>assetRedirection</method>
</company_oldweburlredirect>
</observers>
</controller_action_predispatch>
</events>
</global>
</config>
我的尝试:
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()))
答案 0 :(得分:1)
您可以通过执行
打印出SQLAlchemy生成的查询print(query)
在这种特殊情况下,Properties
的加入条件是错误的。 str(ListingCalendarDays.listing_id)
生成文字字符串"ListingCalendarDays.listing_id"
,而不是列为listing_id
的{{1}}列。varchar
对于演员表,您需要cast()
构造:
cast(ListingCalendarDays.listing_id, String)
此外,您还缺少p.id <> ''
条件。
全部放在一起:
and_(Properties.id == cast(ListingCalendarDays.listing_id, String),
Properties.id != None,
Properties.id != "")