[python-sybase] Pulling my hair out about a query...

Skip Montanaro skip at pobox.com
Tue, 22 Jun 2004 14:06:32 -0500


    >> I have a fairly straightforward query:
    ...
    >> that fails (returns no result rows) from Python. 

    stan> a.  Is it possible to get an error code from the
    stan> cursor?  It should be an attribute you can print.

I don't see anything like an error attribute and cursor objects done have
__getattr__ methods so it can't be a dynamically retrieved thing.  I also
checked the cursor's _fetcher attribute and the connection for error-like
attributes but didn't see anything.

    stan> b.  Can it be that the date routine is not being
    stan> called until after the main query has run?  You could
    stan> check this by declaring variables and setting them
    stan> with the date call before you run the actual query. 
    stan> If the dates are unassigned while the query runs, you
    stan> would get no results.

I'm not sure what you mean here.  When run, this code

    import Sybase

    q = """\
    SELECT trade_time, price
      FROM underlying_daily_fp
      WHERE symbol = @sym
        AND instrument = @inst
        AND trade_time BETWEEN @start AND @end
        AND (price_type='H' or price_type='L')
      ORDER BY trade_time DESC
    """

    args = {'@sym': 'ES',
            '@start': Sybase.Date(2004, 4, 19),
            '@end': Sybase.Date(2004, 5, 17),
            '@inst': 'F'
            }

    print [(k,type(v),v) for (k,v) in args.items()]

    conn = Sybase.Connection(...)
    c = conn.cursor()
    c.execute(q, args)
    print c.fetchall()

prints this output:

    [('@sym', <type 'str'>, 'ES'), ('@start', <type 'DateTimeType'>, 'Apr 19
    2004 12:00AM'), ('@end', <type 'DateTimeType'>, 'May 17 2004 12:00AM'),
    ('@inst', <type 'str'>, 'F')] 
    []

The DateTimeType objects are clearly created before the query executes.  In
any case, I'm not sure what you mean by "declaring variables and setting
them with the date call".  Is this something I embed in my query string?

If I twiddle the trade_time clause to be any of

        AND trade_time >= @start
        AND trade_time <= @end

or

        AND trade_time >= @start

or

        AND trade_time <= @end

the query always returns empty results.  If I remove the trade_time clause
altogether the query succeeds, but of course the date range of the returned
results is incorrect.

Thx,

-- 
Skip Montanaro
skip@pobox.com