Python 通过 for 循环将字符串参数传递给 sql 执行

Python Passing string Parameters via for loop into sql execute

试图弄清楚如何将每个字符串从我的循环传递到 SQL 以遍历每个国家并创建一个特定于每个国家的 excel 文件(每个国家有 5 excel 个文件有自己的特定国家数据)。我发现执行 .join 和 IN() 语句的代码有效,但将所有 5 个国家/地区放入所有 5 个文件中。

代码:

import CX_Oracle
Import xlwt
country_list = ['PERU','GUATEMALA','BAHAMAS','BARBADOS']

for country in country_list:
    SQL = "SELECT * from TABLE WHERE COUNTRY = %s" % country
    cursor = con.cursor()
    cursor.execute(SQL)
    book = xlwt.Workbook()
    sheet1 = book.add_sheet('Summary')
    for i, row in enumerate(cursor):
        for j, col in enumerate(row):
        sheet1.write(i+1,j,col)  #Starts pasting the data at row 2
    book.save('Output_' + country + '.xls')

Error "PERU" Invalid character.  

您应该包括字符串文字的单引号,即:

SQL = "SELECT * from TABLE WHERE COUNTRY = '%s'" % country

在SQL中,字符串需要用引号括起来'。在您的查询中,%s 不会被替换后的那些包围。

现在,您的查询看起来像 SELECT * from TABLE WHERE COUNTRY = PERU,而您正在寻找 SELECT * from TABLE WHERE COUNTRY = 'PERU'。只需用引号将 %s 括起来。

(如果您的查询出现错误,通常在替换后打印最终查询很有用,以查看它是否有效 SQL。)

比包含引号更好的是避免显式字符串格式化。而是在执行中将参数作为第二个参数传递。 Psycopg2 将为您处理。 这将使您免于潜在的代码注入和遗漏引号等错误

cursor.execute("SELECT * from TABLE WHERE COUNTRY = %s" , ('USA',))

http://initd.org/psycopg/docs/cursor.html#cursor.execute