[DB-SIG] pyformat Parameter Style

Gerhard Häring gh at ghaering.de
Tue May 13 19:57:36 EDT 2003


Chris Cogdon wrote:
> 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
>> implementation).
> 
> *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.

I was going to answer in this thread, but there's nothing I could add to 
this brilliant post.

-- Gerhard



More information about the DB-SIG mailing list