您好,我有一个用三引号引起来的查询
f_name = "'Pra_%'"
df = cp.sql("""SELECT first_name, last_name, FROM Students
WHERE first_name LIKE %s
AND last_name LIKE '%Elephant%'
""" % (f_name))
期望查询从 f_name 中选取值并替换 WHERE 子句中的 %s。
收到以下错误:
TypeErrorTraceback (most recent call last)
<ipython-input-22-6544d0eca4d1> in <module>()
3 WHERE first_name LIKE %s
4 AND last_name LIKE '%Elephant%'
---> 5 """ % (f_name))
TypeError: not enough arguments for format string
我猜它正在将 %Elephant% 中的 %E 视为 Float 并期待一个参数。它在 WHERE 子句中没有第二个条件(AND last_name LIKE '%Elephant%')时起作用。
在这种情况下,我如何转义它才能使其正常工作?
请您参考如下方法:
保护自己免受 SQL injection 的侵害通过避免字符串格式化。 到处使用参数化 sql:
import pandas.io.sql as psql
sql = """SELECT first_name, last_name, FROM Students
WHERE first_name LIKE %s
AND last_name LIKE %s"""
args = ('Pra_%', '%Elephant%')
df = psql.read_sql(sql, conn, params=args)
请注意,您不必双引号 'Pra_%'。数据库适配器将为您引用参数。所以使用参数化sql不仅更安全,也更容易。
