Python通过for循环将parameter passing给sql execute

试图找出如何将每个string从我的循环传递到SQL来遍历每个国家,并创build一个特定于每个国家(每个有自己的国家数据的5个Excel文件)的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中,string需要用引号括起来。 在你的查询中, %s不会被replace后的那些包围。

现在,你的查询看起来像SELECT * from TABLE WHERE COUNTRY = PERU ,而你SELECT * from TABLE WHERE COUNTRY = 'PERU' 。 只需用引号包围%s

(如果你的查询给你提供了错误,通常在replace之后打印最终查询是很有用的,看看它是否是有效的SQL。)

甚至比包括引号更好避免明确的string格式。 而是在执行中传递参数作为第二个参数。 Psycopg2将为您处理。 这样可以避免潜在的代码注入以及错误报价等错误

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

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

你应该包括string文字的单引号,即:

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