Why do I get "TypeError: not all arguments converted during string formatting" when trying to use a string in a parameterized SQL query?
Почему я получаю "TypeError: не все аргументы преобразованы при форматировании строки" при попытке использовать строку в параметризованном SQL-запросе?
У меня есть этот код:
#! /usr/bin/env python import MySQLdb as mdb import sys
classTest: defcheck(self, search): try: con = mdb.connect('localhost', 'root', 'password', 'recordsdb'); cur = con.cursor() cur.execute( "SELECT * FROM records WHERE email LIKE '%s'", search ) ver = cur.fetchone() print"Output : %s " % ver except mdb.Error, e: print"Error %d: %s" % (e.args[0],e.args[1]) sys.exit(1) finally: if con: con.close()
test = Test() test.check("test")
Но я получаю ошибку типа:
Traceback (most recent call last): File "./lookup", line 27, in <module> test.check("test") File "./lookup", line 11, in creep cur.execute( "SELECT * FROM records WHERE email LIKE '%s'", search ) File "/usr/local/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 187, in execute query = query % tuple([db.literal(item) for item in args]) TypeError: notall arguments converted during string formatting
cur.execute( "SELECT * FROM records WHERE email LIKE '%s'", search )
Попробуйте это:
cur.execute( "SELECT * FROM records WHERE email LIKE %s", [search] )
Смотрите документацию MySQLdb . Причина в том, что второй параметр execute представляет список объектов, подлежащих преобразованию, потому что у вас может быть произвольное количество объектов в параметризованном запросе. В этом случае у вас есть только один, но он все равно должен быть итерируемым (кортеж вместо списка также подойдет).
Ответ 2
Вы можете попробовать этот код:
cur.execute( "SELECT * FROM records WHERE email LIKE %s", (search,) )