Форматы строк Python с подстановочными знаками SQL и LIKE
Мне сложно загружать некоторые sql в python, чтобы правильно переходить через MySQLdb. Это pythons string форматирование, которое убивает меня.
В моем заявлении sql используется ключевое слово LIKE с подстановочными знаками. Я пробовал несколько разных вещей в Python. Проблема в том, что однажды я получу один из них, там есть строка кода в MySQLdb, которая отрывается в строчном формате.
Попытка 1:
"SELECT tag.userId, count (user.id) как totalRows FROM user INNER JOIN tag ON user.id = tag.userId WHERE user.username LIKE '%% s%'" % (query)
Это не выход. Я получаю ошибку значения:
ValueError: символ неподдерживаемого формата '' '(0x27) с индексом 128
Попытка 2:
"SELECT tag.userId, count (user.id) как totalRows FROM user INNER JOIN tag ON user.id = tag.userId WHERE user.username LIKE '\ %% s \%'" % (Запрос)
Получаю тот же результат из попытки 1.
Попытка 3:
like = "LIKE '%" + str (query) + "%'" totalq = "SELECT tag.userId, count (user.id) как totalRows FROM user INNER JOIN tag ON user.id = tag.userId WHERE user.username" + like
Это правильно создает переменную totalq, но теперь, когда я иду запускать запрос, я получаю ошибки от MySQLdb:
Файл "build/bdist.macosx-10.6-universal/egg/MySQLdb/cursors.py", строка 158, in execute query = query% db.literal(args) ТипError: недостаточно аргументы для строки формата
Попытка 4:
like = "LIKE '\%" + str (query) + "\%'" totalq = "SELECT tag.userId, count (user.id) как totalRows FROM user INNER JOIN tag ON user.id = tag.userId WHERE user.username" + like
Это тот же результат, что и попытка 3.
Все это кажется действительно странным. Как я могу использовать подстановочные знаки в операциях sql с python?
Ответы
Ответ 1
Это не о форматировании строки, но проблема в том, как запросы должны выполняться в соответствии с требованиями к операциям db в Python (PEP 249)
попробуйте что-то вроде этого:
sql = "SELECT column FROM table WHERE col1=%s AND col2=%s"
params = (col1_value, col2_value)
cursor.execute(sql, params)
вот несколько примеров для psycog2, где у вас есть некоторые объяснения, которые также должны быть действительны для mysql (mysqldb также следует за PEP249 dba api guide 2.0: вот примеры для mysqldb)
Ответ 2
Все эти запросы кажутся уязвимыми для атак SQL-инъекций.
Попробуйте что-то вроде этого:
curs.execute("""SELECT tag.userId, count(user.id) as totalRows
FROM user
INNER JOIN tag ON user.id = tag.userId
WHERE user.username LIKE %s""", ('%' + query + '%',))
Если для execute()
передано два аргумента.
Ответ 3
Чтобы избежать амперсандов в выражениях форматирования строки Python, удвоьте амперсанд:
'%%%s%%' % search_string
Изменить: Но я определенно согласен с другим ответом. Прямая замена строк в SQL-запросах - почти всегда плохая идея.
Ответ 4
Мы могли бы попытаться избежать процентного символа, удвоив их следующим образом:
query_to_get_user_name = """
SELECT tag.userId, count(user.id) as totalRows FROM user INNER JOIN tag
ON user.id = tag.userId
WHERE user.username LIKE '%%%s%%' """ % (user_name,)
cursor.execute(query_to_get_user_name)
Ответ 5
У меня есть решение вашей проблемы:
Вы не можете использовать:
"SELECT tag.userId, count(user.id) as totalRows FROM user INNER JOIN tag ON user.id = tag.userId WHERE user.username LIKE '%%s%'" % (query)
вы можете изменить его с помощью шаблона строки, например:
import MySQLdb
import string # string module
.......
value = {'user':'your value'}
sql_template = string.Template("""
SELECT tag.userId, count(user.id) as totalRows FROM user INNER JOIN
tag ON user.id = tag.userId WHERE user.username LIKE '%$user%'
""")
sql = sql_template.substitute(value)
try:
cursor.execute(sql)
...........
except:
...........
finally :
db.close()