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',))
试图弄清楚如何将每个字符串从我的循环传递到 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',))