2017-10-09 112 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不僅更安全,而且更容易。