On Fri, May 17, 2013 at 5:22 PM, Michael Bayer <mike...@zzzcomputing.com> wrote:
>
> The major issue with format/pyformat is that too many DBAPIs take the easy 
> way out and just run their string through Python's "%" operator.   This 
> causes DBAPIs that use the format styles to behave differently from those 
> that don't.   In particular, a problem I have with MySQL-python and *maybe* 
> recent versions of psycopg2 (would have to check again) is that the behavior 
> changes whether or not I pass parameters to cursor.execute(). The same 
> statement that includes a "%" sign as part of the string must be passed 
> without escaping when no list/dictionary is passed as the second argument, 
> but when a list/dictionary is passed, the parsing changes and now the % sign 
> has to be escaped normally.   This is an undocumented behavior that's 
> directly a side effect of the DBAPI saying, "oh there's parameters, let's 
> call "stmt % params", vs. not.

On this specific point you are right, and just yesterday I had to
apologise for the inconsistency with a colleague of mine. This is
something I would probably fix in an eventual "psycopg3" that would
break compatibility with the past, but note that it would only affect
functions that use the % operator and have no parameter: a minimal
number (can't remember on top of my head if the % is used for other
syntactical elements in postgres: not that I recall).

OTOH if you want consistent behaviour with the %s and %%s just pass an
empty tuple to queries taking no argument. You are a framework, you
can do that (I would do that in psycopg by specifying the empty tuple
as default argument for execute's params, or or something semantically
equivalent).

-- Daniele
_______________________________________________
DB-SIG maillist  -  DB-SIG@python.org
http://mail.python.org/mailman/listinfo/db-sig

Reply via email to