Подтвердить что ты не робот

Форматы строк 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?

4b9b3361

Ответ 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()