如何在 mysql 连接器 python 查询中获取文字“%”?
How do I get a literal '%' in a mysql connector python query?
考虑这段代码:
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
是对连接对象的引用。
我希望它执行类似于以下内容的操作:
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"
这是预期的输出。我该如何解决这个问题?
占位符不像复制和粘贴那样工作,您不能只是将它们放在任何地方并期望它们被理解。即使它确实像那样工作,在你的情况下你最终会得到 like %foo%
,这是无效的 SQL 语法。
您需要将一个字符串占位符放入查询中,并提供一个包含 LIKE
通配符的字符串作为参数:
csr.execute('... LIKE %s ...', (f'%{searchstr}%', ...))
换句话说,您从 Python 提供 %
通配符,而不是从 SQL 语句中提供。
考虑这段代码:
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
是对连接对象的引用。
我希望它执行类似于以下内容的操作:
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"
这是预期的输出。我该如何解决这个问题?
占位符不像复制和粘贴那样工作,您不能只是将它们放在任何地方并期望它们被理解。即使它确实像那样工作,在你的情况下你最终会得到 like %foo%
,这是无效的 SQL 语法。
您需要将一个字符串占位符放入查询中,并提供一个包含 LIKE
通配符的字符串作为参数:
csr.execute('... LIKE %s ...', (f'%{searchstr}%', ...))
换句话说,您从 Python 提供 %
通配符,而不是从 SQL 语句中提供。