2017-10-09 109 views
1

您好我有三重引号摆脱%E

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%为Float治疗%E和期待的理由。它在WHERE子句中没有第二个条件(AND last_name LIKE '%Elephant%')时起作用。

我该如何逃避它使它在这种情况下工作?

回答

3

为了逃避%,你需要避免字符串格式化从SQL injection翻倍成%%

+0

这工作!谢谢。 @AlanCPSC –

+1

该解决方案正常工作,但** unutbu **下面提出的解决方案更安全。 – RoyaumeIX

4

保护自己。 使用参数化的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不仅更安全,而且更容易。