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

Python: ValueError: символ неподдерживаемого формата '' '(0x27) в индексе 1

Я пытаюсь выполнить запрос для поиска 3 таблиц в базе данных с использованием MySQL через Python. Каждый раз, когда я пытаюсь выполнить следующую строку в качестве запроса, она дает мне ошибку о конкатенации в строке.

"SELECT fileid FROM files WHERE description LIKE '%" + search + "%' OR filename LIKE '%" + search + "%' OR uploader LIKE '%" + search + "%' ORDER BY fileid DESC"

Это ошибка, которую он мне дал:

ValueError: unsupported format character ''' (0x27) at index 1

Если я удалю символ, который он запрашивает, я также должен удалить%, что фактически прекратит выполнение запроса. Что я могу сделать, чтобы исправить это, так как я довольно новичок в Python.

Спасибо, Kris

4b9b3361

Ответ 1

Похоже, что python интерпретирует символ% как символ формата, подобный printf. Попробуйте использовать %%?

"SELECT fileid 
FROM files 
WHERE description LIKE '%%%s%%' 
    OR filename LIKE '%%%s%%' 
    OR uploader LIKE '%%%s%%' 
    ORDER BY fileid DESC" % (search, search, search)

Ответ 2

Только для вас: я попробовал решение @Pochi сегодня, в Python 3.6, и по какой-то причине оно вызвало непредвиденное поведение. У меня было два и три аргумента для строки формата, поэтому в конце было:

% (Search, Search)

Моя строка ("поиск") начиналась с верхней буквы "S". Я получил сообщение об ошибке:

ValueError: unsupported format character 'S' (0x53) at index 113

Я изменил прописные буквы на строчные, и ошибка была:

TypeError: not enough arguments for format string

Затем я просто поместил свои аргументы внутри двойного %% в начале и в конце, и это сработало. Мой код выглядел так:

"SELECT fileid 
FROM files 
WHERE description LIKE '%%search%%' 
    OR filename LIKE '%%search%%'
    ORDER BY fileid DESC"

Другое решение будет предоставлено @Alice Yuan. Она просто удвоила процент, поет, и это работает.

Ответ 3

вы можете попробовать следующее:

SELECT fileid 
FROM files 
WHERE description LIKE '%%%%%s%%%%' 
OR filename LIKE '%%%%%s%%%%' 
OR uploader LIKE '%%%%%s%%%%' 
ORDER BY fileid DESC" % (search, search, search)

Ответ 4

Мое решение:

query = """SELECT id, name FROM provice WHERE name LIKE %s"""
cursor.execute(query, '%%%s%%' % name)

Я думаю, что это простой способ исправить эту проблему!

Ответ 5

Самый простой ответ - добавить к значению подстановочный знак LIKE "%". Это правильно процитировано и не соответствует шаблону LIKE.

В Python 3. 6+ вы можете использовать f-строку, чтобы включить подстановочный знак LIKE '%' в значение, которое правильно вставляет экранированное значение строки в SQL:

# string to find, e.g.,
search = 'find-me'

# Parameterised SQL template
sql = """SELECT fileid FROM files
WHERE description LIKE %s OR filename LIKE %s OR uploader LIKE %s
ORDER BY fileid DESC"""

# Combine LIKE wildcard with search value
like_val = f'%{search}%'

# Run query with correctly quoted and escaped LIKE pattern
cursor.execute(sql, (like_val, like_val, like_val))