LINUX.ORG.RU

python, mysql и упраляющие символы


0

0

есть код:
...
query = u'SHOW TABLES LIKE "log_\u0025"'
tables = db.query(query)
...

т.к. мну нужно сделать выборку таблиц, начинающихся на "log_"
"0025" - это "%" в 16-ой таблице, т.е.

>>> query = u'SHOW TABLES LIKE "log_\u0025"'
>>> print query
SHOW TABLES LIKE "log_%"

но веб-сервер дает такую ошибку:

"2009-06-22 11:36:54: (mod_fastcgi.c.2610) FastCGI-stderr: Traceback (most recent call last):
File "/var/lib/python-support/python2.5/web/application.py", line 211, in process
return self.handle()
File "/var/lib/python-support/python2.5/web/application.py", line 201, in handle
return self._delegate(fn, self.fvars, args)
File "/var/lib/python-support/python2.5/web/application.py", line 385, in _delegate
return handle_class(cls)
File "/var/lib/python-support/python2.5/web/application.py", line 360, in handle_class
return tocall(*args)
File "/var/www/faxes/code.py", line 19, in GET
tables = db.query(query)
File "/var/lib/python-support/python2.5/web/db.py", line 579, in query
self._db_execute(db_cursor, sql_query)
File "/var/lib/python-support/python2.5/web/db.py", line 530, in _db_execute
for x in sql_query.values()])
File "/var/lib/python-support/python2.5/MySQLdb/cursors.py", line 151, in execute
query = query % db.literal(args)
TypeError: not enough arguments for format string"

Т.е., как я понял, он воспринимает символ "%" как управляющий для форматирования. Где я туплю?

★★★★★

Ответ на: комментарий от anonymous4

При db.query('SHOW TABLES LIKE %s', "log_%"):

2009-06-22 12:08:38: (mod_fastcgi.c.2610) FastCGI-stderr: Traceback (most recent call last):
File "/var/lib/python-support/python2.5/web/application.py", line 211, in process
return self.handle()
File "/var/lib/python-support/python2.5/web/application.py", line 201, in handle
return self._delegate(fn, self.fvars, args)
File "/var/lib/python-support/python2.5/web/application.py", line 385, in _delegate
return handle_class(cls)
File "/var/lib/python-support/python2.5/web/application.py", line 360, in handle_class
return tocall(*args)
File "/var/www/faxes/code.py", line 18, in GET
tables = db.query('SHOW TABLES LIKE %s', "log_%")
File "/var/lib/python-support/python2.5/web/db.py", line 574, in query
sql_query = reparam(sql_query, vars)
File "/var/lib/python-support/python2.5/web/db.py", line 238, in reparam
dictionary = dictionary.copy() # eval mucks with it
AttributeError: 'str' object has no attribute 'copy'


и при db.query('SHOW TABLES LIKE %s' % "log_%"):

2009-06-22 12:07:34: (mod_fastcgi.c.2610) FastCGI-stderr: Traceback (most recent call last):
File "/var/lib/python-support/python2.5/web/application.py", line 211, in process
return self.handle()
File "/var/lib/python-support/python2.5/web/application.py", line 201, in handle
return self._delegate(fn, self.fvars, args)
File "/var/lib/python-support/python2.5/web/application.py", line 385, in _delegate
return handle_class(cls)
File "/var/lib/python-support/python2.5/web/application.py", line 360, in handle_class
return tocall(*args)
File "/var/www/faxes/code.py", line 18, in GET
tables = db.query('SHOW TABLES LIKE %s' % "log_%")
File "/var/lib/python-support/python2.5/web/db.py", line 579, in query
self._db_execute(db_cursor, sql_query)
File "/var/lib/python-support/python2.5/web/db.py", line 530, in _db_execute
for x in sql_query.values()])
File "/var/lib/python-support/python2.5/MySQLdb/cursors.py", line 151, in execute
query = query % db.literal(args)
ValueError: incomplete format

Turbid ★★★★★
() автор топика
Ответ на: комментарий от Turbid

С обычным MySQLdb работает прекрасно - специально проверил.

А ты, похоже, используешь web.py (кстати, так бы с разу и сказал). Смотри документацию к web.db: http://webpy.org/docs/0.3/api#web.db Там указаны варианты передачи параметров в запрос.

И помни! Никогда нельзя параметры хардкодить в текст запроса! (повторяюсь, ибо эту максиму слишком часто забывают)

anonymous4
()
Ответ на: комментарий от anonymous4

Спасибо! Вот так работает:

db.query("SHOW TABLES LIKE $x", vars=dict(x='log_%'))

Turbid ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.