[DB-SIG] pyformat Parameter Style
chris at cogdon.org
Tue May 13 09:27:48 EDT 2003
On Tuesday, May 13, 2003, at 02:31 US/Pacific, M.-A. Lemburg wrote:
> However, I don't understand why the current implementations
> don't use Python's wealth of format characters (and it's formatting
*I* understand why :)
When one is passing data to the SQL backend, it should be up to the
BACKEND to determine how it is passed, and by that, I mean the python
interface to the backend. Take this example:
Say I want to store a float into a row. The current way, which works,
would be to do this:
cursor.execute ( "insert into data ( %s )", my_float )
The interface sees the floating point value, turns that into the
'appropriate' representation that the SQL syntax accepts, and then
passes it to the DBMS. Now, it is 'expected' that the interface knows
what the 'appropriate' format is, and does what's Right. Not only
should the application writer not know, and not be forced to worry
about it, but he shouldn't be ALLOWED to worry about it. For example:
cursor.execute ( "insert into data ( %2.2f )", my_float )
Now, why in the world would you ever WANT to strip off the precision
from the value? It just doesn't make any sense.
I think here's the reasoning for the mistake:
THe '%' operator in python is a DISPLAY formatting operator. Ie, grab a
value, turn it into a string appropriate for the particular
application's DISPLAY purposes. However, in the 'pass values to the SQL
backend' application, we're not displaying anything, but instead
passing data to the sql backend.
The '%s' and '%(keyname)s' syntax was used because it was convenient,
did the job, required VERY little coding and didn't interfere with
anything else. This does not mean that "Oh, since the python % operator
is used in the interface, that means we can use all the OTHER python
formatting codes, too"
I agree that the DB-API spec as written implies that the other codes
can be used too, but I do not think this was the intention and, I would
argue, given the above reasons, that we do NOT code for this
circumstance. Using all the python formatting operators does not make
sense in this circumstance because it should NOT be up to the
application writer to determine how the data is being passed to the
backend. It should be up to the interface, which knows a lot more about
the backend's requirements than the application writer.
("`-/")_.-'"``-._ Chris Cogdon <chris at cogdon.org>
. . `; -._ )-;-,_`)
(v_,)' _ )`-.\ ``-'
_.- _..-_/ / ((.'
((,.-' ((,/ fL
More information about the DB-SIG