Вопрос-Ответ

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

class Test:
def check(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: not all arguments converted during string formatting

Что не так, и как мне это исправить?


Та же проблема возникает в sqlitem, но сообщается по-другому; см. sqlite3 .ProgrammingError: указано неверное количество привязок. В текущем операторе используется 1, и их указано 74 для получения подробной информации.

Переведено автоматически
Ответ 1

Вместо этого:

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,) )

Вы можете посмотреть документацию

Ответ 3

ключевое слово '%' настолько опасно, потому что оно является основной причиной "АТАКИ SQL-ИНЪЕКЦИЕЙ".
Итак, вы просто используете этот код.

cursor.execute("select * from table where example=%s", (example,))

или

t = (example,)
cursor.execute("select * from table where example=%s", t)

если вы хотите попробовать вставить в таблицу, попробуйте это.

name = 'ksg'
age = 19
sex = 'male'
t = (name, age, sex)
cursor.execute("insert into table values(%s,%d,%s)", t)
Ответ 4
cur.execute( "SELECT * FROM records WHERE email LIKE %s", (search,) )

Я не знаю почему, но у меня это работает . вместо того, чтобы использовать '%s'.

python