Мне нелегко заставлять некоторый sql в Python правильно проходить MySQLdb. Это - строка Python, форматирующая, который уничтожает меня.
Мой sql оператор использует ПОДОБНОЕ ключевое слово с подстановочными знаками. Я попробовал много разных вещей в Python. Проблема состоит в том, после того как я получаю одного из них работа, существует строка кода в MySQLdb, который рыгает на формате строки.
Попытка 1:
"ВЫБЕРИТЕ tag.userId, количество (user.id), поскольку totalRows ОТ пользовательского ВНУТРЕННЕГО ОБЪЕДИНЕНИЯ наклеивают user.id = tag.userId ГДЕ user.username КАК '%% s %'" % (запрос)
Это не, идут. Я получаю ошибку значения:
ValueError: символ неподдерживаемого формата ''' (0x27) в индексе 128
Попытка 2:
"ВЫБЕРИТЕ tag.userId, количество (user.id), поскольку totalRows ОТ пользовательского ВНУТРЕННЕГО ОБЪЕДИНЕНИЯ наклеивают user.id = tag.userId ГДЕ user.username КАК '\%% s \%'" % (запрос)
Я получаю тот же результат попытки 1.
Попытка 3:
как = "КАК '%" + ул. (запрос) + "%'" totalq = "ВЫБИРАЕТ tag.userId, количество (user.id), поскольку totalRows ОТ пользовательского ВНУТРЕННЕГО ОБЪЕДИНЕНИЯ наклеивают user.id = tag.userId ГДЕ user.username" + как
Это правильно создает totalq переменную, но теперь когда я иду для выполнения запроса, я получаю ошибки от MySQLdb:
Файл "build/bdist.macosx-10.6-universal/egg/MySQLdb/cursors.py", строка 158, в выполняет запрос = % запроса db.literal (args) TypeError: недостаточно аргументов в пользу строки формата
Попытка 4:
как = "КАК '\%" + ул. (запрос) + "\%'" totalq = "ВЫБИРАЕТ tag.userId, количество (user.id), поскольку totalRows ОТ пользовательского ВНУТРЕННЕГО ОБЪЕДИНЕНИЯ наклеивают user.id = tag.userId ГДЕ user.username" + как
Это - тот же вывод как попытка 3.
Это все кажется действительно странным. Как я могу использовать подстановочные знаки в sql операторах с Python?
Дело не в форматировании строк, а в том, как должны выполняться запросы в соответствии с требованиями операций с базами данных в 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 также следует руководству 2.0 API PEP249 dba: вот примеры для mysqldb )
Все эти запросы кажутся уязвимыми для атак с использованием 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 ()
.
Чтобы избежать амперсандов в выражениях форматирования строк Python, удвойте амперсанд:
'%%%s%%' % search_string
Edit: Но я определенно согласен с другим ответом. Прямая подстановка строк в SQL-запросах - почти всегда плохая идея.