Нераспознанный токен python sqlite3: "{"

Этот синтаксис:

consulta.execute("SELECT * FROM {0} WHERE rut LIKE '%"+str(cadena)+"%'".format(tablepx))

выдает ошибку:

sqlite3.OperationalError: unrecognized token: "{"

Я тоже пробовал с этим:

consulta.execute("SELECT * FROM {0} WHERE rut LIKE ?".format(tablepx),(cadena,))

Он не отправляет ошибку, но ничего не происходит, он не работает, так как я получаю нулевые результаты из базы данных.

Я не умею работать с '%" + str(cadena) +"%', всегда работаю с .format().

Как выглядит str(cadena)?

Sianur 06.09.2018 16:13

ах, ежедневный вопрос о конкатенации SQL-запросов. Не надо. Используйте параметризованный запрос.

DeepSpace 06.09.2018 16:14
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
195
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы форматируете последний раздел своей строки:

"%'".format(tablepx)

прежде чем объединить это с результатом "..." + str(cadena). Таким образом, заполнитель {0} в строковом литерале первый не заполняется, и в качестве запроса остается "SELECT * FROM {0} WHERE rut LIKE '%...%'" (с заменой ... значением cadena).

Вы можете исправить это, переместив вызов .format() в строковый литерал "SELECT * FROM {0} WHERE rut LIKE '%". Или с помощью второго заполнителя {1}, чтобы показать, куда должно идти значение cadeda, вместо использования конкатенаций +.

Однако, вам не следует использовать конкатенацию строк для помещения cadena в строку в первую очередь. У вас была правильная идея, используя заполнитель ? и значение параметра запроса, но вы забыли добавить символы запроса LIKE % к вашему значению cadena.

Просто добавьте символы % в начало и конец cadena, а затем используйте результат в качестве параметра:

like_string = '%{0}%'.format(cadena)
consulta.execute(
    "SELECT * FROM {0} WHERE rut LIKE ?".format(tablepx),
    (like_string,))

Заполнитель ? в строке запроса будет использоваться для размещения правильно экранированной строки запроса LIKE с добавлением % в начало и конец значения cadena.

Я не могу не подчеркнуть, что использование str.format() для интерполяции имени таблицы в строку запроса (как вы это делаете с tablepx) может открыть вам проблемы с SQL-инъекцией. См. этот другой мой ответ для получения дополнительных советов по этому поводу, а также альтернатив. Чтобы быть в безопасности, я бы хотя бы использовал "{0}" в качестве позиции имени таблицы и tablepx.replace('"', '""'), чтобы SQLite хотя бы знал, что нужно принимать только допустимые имена объектов в этой части строки:

like_string = '%{0}%'.format(cadena)
consulta.execute(
    'SELECT * FROM "{0}" WHERE rut LIKE ?'.format(tablepx.replace('"', '""')),
    (like_string,))

Спасибо, ребята, я запихнул эту консультацию

Giova 06.09.2018 16:32

@Giova: однако я бы предпочел действительно не использовать этот формат, потому что любая ненадежная сторона, которая может установить значение cadena, может взломать вашу базу данных.

Martijn Pieters 06.09.2018 16:35

что я могу сделать, чтобы избежать взлома?

Giova 06.09.2018 18:18

@Giova: используя синтаксис в конце моего ответа. Если tablepx не является тем, что пользователь предоставляет (или может предоставить часть стоимости), тогда первого примера в моем ответе будет достаточно. Оба создают like_string, сначала добавляя % в начало и конец cadena, а затем используя like_string в качестве параметра запроса.

Martijn Pieters 07.09.2018 11:34

Другие вопросы по теме