Drop Table w/ MySQLdb?

Mark Lawrence breamoreboy at yahoo.co.uk
Mon Jun 7 10:05:59 EDT 2010


On 06/06/2010 21:20, Dennis Lee Bieber wrote:
> On Sun, 6 Jun 2010 11:07:25 -0400, Victor Subervi
> <victorsubervi at gmail.com>  declaimed the following in
> gmane.comp.python.general:
>
>> Hi;
>> I tried this:
>>
>>      cursor.execute('drop table tmp%s', tmpTable)
>>
> 	ONCE AGAIN...
>
> 	Database SCHEMA entities must be formatted using the Python %
> operator. AND they should never be obtained as input from a user.
>
> 	DATA ITEMS obtained from anywhere need to use parameterized query
> passing so that the DB-API can safely escape them, and in the case of
> MySQLdb, put quote marks around them.
>
> 	SCHEMA entities are: DATABASE name, TABLE name, COLUMN name (and if
> you have them, TRIGGER, PROCEDURE, and VIEW names).
>
> 	The statement you have is SCHEMA manipulation.
>
> 	Print this out and tape it to your monitor. The next time you get
> one of these "inexplicable" error messages, review the above statements
> and compare to your query. I'm sure the answer will be obvious.
>
>
> 	Do you have edit access to the MySQLdb files? If so, open
> cursors.py, find the execute method, and put in a print statement. This
> does also assume you are running locally (not via a web client) so that
> the output can be seen on screen.
>
> (Mine is located in E:\Python25\Lib\site-packages\MySQLdb\cursors.py)
>
> Look for:
>
> -=-=-=-=-
>      def execute(self, query, args=None):
>
>          """Execute a query.
>
>          query -- string, query to execute on server
>          args -- optional sequence or mapping, parameters to use with
> query.
>
>          Note: If args is a sequence, then %s must be used as the
>          parameter placeholder in the query. If a mapping is used,
>          %(key)s must be used as the placeholder.
>
>          Returns long integer rows affected, if any
>
>          """
>          from types import ListType, TupleType
>          from sys import exc_info
>          del self.messages[:]
>          db = self._get_db()
>          charset = db.character_set_name()
>          if isinstance(query, unicode):
>              query = query.encode(charset)
>          if args is not None:
>              query = query % db.literal(args)
>          try:
>              r = self._query(query)
>          except TypeError, m:
>              if m.args[0] in ("not enough arguments for format string",
>   -=-=-=-=-
> and change
>
>          if args is not None:
>              query = query % db.literal(args)
>
> into
>          if args is not None:
>              query = query % db.literal(args)
>              print query
>
> 	Notice how your use of % for testing does NOT generate the same code
> -- MySQLdb invokes db.literal() to escape the arguments, but you are
> doing just
> 	query = query % (args)
>
>
>>      cursor.execute('drop table tmp%s', tmpTable)
>
> produces
> 	drop table tmp'xyz'
> NOT
> 	drop table tmpxyz
>

Well put Sir.  Can I suggest that the OPs continual requests for 
assistance are simply not cricket? :)  Yeah, I'm a Brit, and yeah, I'm 
fed up with getting thrashed by the Aussies.

Kindest regards.

Mark Lawrence.




More information about the Python-list mailing list