Форматы строки Python с подстановочными знаками SQL и КАК

Мне нелегко заставлять некоторый 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?

22
задан Cœur 17 March 2018 в 11:09
поделиться

3 ответа

Дело не в форматировании строк, а в том, как должны выполняться запросы в соответствии с требованиями операций с базами данных в 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 )

11
ответ дан 29 November 2019 в 04:26
поделиться

Все эти запросы кажутся уязвимыми для атак с использованием 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 () .

26
ответ дан 29 November 2019 в 04:26
поделиться

Чтобы избежать амперсандов в выражениях форматирования строк Python, удвойте амперсанд:

'%%%s%%' % search_string

Edit: Но я определенно согласен с другим ответом. Прямая подстановка строк в SQL-запросах - почти всегда плохая идея.

10
ответ дан 29 November 2019 в 04:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: