#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
.