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

时间:2016-03-16 14:26:56

标签: python sql sqlalchemy

我试图将原始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()))

1 个答案:

答案 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 != "")