Как мне получить буквальный ‘%’ в запросе python соединителя mysql?

#python #mysql #string-formatting #mysql-connector-python

#python #mysql #форматирование строки #mysql-connector-python

Вопрос:

Рассмотрим этот код:

 def search(searchstr: str, limit: int=10, offset: int=0):
    csr = app.sql.cursor(dictionary=True)
    csr.execute("select username, fname, bio from followers where username like %%%s%% limit %d offset %d", (searchstr, limit, offset))
    return csr.fetchall()

search("j")
  

где app.sql находится ссылка на объект connection.

Я бы хотел, чтобы он выполнял что-то похожее на: select username, fname, bio from followers where username like %j% limit 10 offset 0 но вместо этого он всегда выдает мне ошибку:

   File "/---/user.py", line 67, in search
    csr.execute("select username, fname, avatarUrl, bio from followers where username like %%%s%% limit %d offset %d", (searchstr, limit, offset))
  File "/---/venv/lib/python3.8/site-packages/mysql/connector/cursor.py", line 542, in execute
    raise errors.ProgrammingError(
mysql.connector.errors.ProgrammingError: Not all parameters were used in the SQL statement
  

Я не могу понять, что я делаю неправильно, потому что

 >>> "%%%s%% %d %d" % ("j", 10, 0)
"%j% 10 0"
  

какой ожидаемый результат. Как я могу это исправить?

Ответ №1:

Заполнители не работают как копирование и вставка, вы не можете просто разместить их где угодно и ожидать, что они будут поняты. Даже если бы это сработало так, в вашем случае вы бы получили like %foo% , что является недопустимым синтаксисом SQL.

Вам нужно поместить в запрос один строковый заполнитель и предоставить строку в качестве аргумента, которая содержит LIKE подстановочные знаки:

 csr.execute('... LIKE %s ...', (f'%{searchstr}%', ...))
  

Другими словами, вы указываете % подстановочные знаки из Python, а не из инструкции SQL.

Комментарии:

1. Я предполагаю, что дополнительная проблема заключается в том, что соединитель SQL понимает только %s как заполнитель, а не %d .