Избегайте «%» в запросе mySQL, выполняемом через python, с символами LIKE и%

0

Я пытаюсь сопоставить строку с "%" в ней с помощью оператора LIKE, но это дает мне python TypeError из-за того, что форматирование становится испорченным.

Пример:

SELECT *
FROM table
WHERE name LIKE "%exam\%ple%"

В python запрос будет выглядеть так, потому что экраны LIKE

match = "%%exam\\%ple%%"

query = """
SELECT *
FROM table
WHERE name LIKE "%s"
""" % (match)

Тем не менее это по-прежнему бросает мне ту же ошибку.

Как написать запрос в python для поиска table где name соответствует всем экземплярам "exam%ple"?

  • 0
    Можете ли вы поделиться своим кодом Python?
  • 0
    @Mureinik обновлен, см. Выше
Показать ещё 2 комментария
Теги:
escaping
wildcard

1 ответ

0
Лучший ответ

Вам не нужно избегать экземпляров% в строке, которая находится справа от% в генерации запроса так:

match = r"%exam\%ple%"  # Use r string to avoid having to double \s
query = """
SELECT *
FROM table
WHERE name LIKE "%s"
""" % (match)
print(query)  # as a check

Результаты в:

SELECT *
FROM table 
WHERE name LIKE "%exam\%ple%"

Также обратите внимание, что вы можете эффективно избежать, т.е. Сделать буквальные,% символов, удвоив их, т.е.% D = номер вставки, но %% d = вставить "% d", однако вам нужно удвоить для каждой выполняемой вами% операции.

Лучшей альтернативой было бы использовать команду format строк format которая доступна как в python 3. 4+, так и в любом python 2.7. Это использует {} как маркер для точек вставки (он классифицируется как мини-язык) и не будет касаться ваших знаков%.

In [2]: "{} == {}".format(1,2)
Out[2]: '1 == 2'

In [3]: match = r"%exam\%ple%"  # Use r string to avoid having to double \s

In [4]: query = """
   ...: SELECT *
   ...: FROM table
   ...: WHERE name LIKE "{}"
   ...: """.format(match)

In [5]: print(query)

SELECT *
FROM table
WHERE name LIKE "%exam\%ple%"
  • 0
    В mySQL это допустимо, но python выдает ошибку TypeError: not enough arguments for format string' , он обрабатывает escape % как переменную строки формата.
  • 0
    Вы можете эффективно экранировать, то есть сделать буквальные символы%, удвоив их, то есть% d = вставить номер, но %% d = вставить "% d"
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню