简体   繁体   English

从数据帧创建逗号分隔列表以传递到 SQL 查询时出错

[英]Error while creating comma separated list from data-frame to pass into SQL query

I am trying to create a comma separated list to pass SQL query.我正在尝试创建一个逗号分隔的列表来传递 SQL 查询。

my code我的代码

sql1 = '''select carrier_name, carrier_account, invoice_number, invoice_amount, currency, invoice_date
from invoice_summary where invoice_number in {}'''.format(tuple(data1['invoice_number'].values.tolist()))

Current Output当前Output

    "select carrier_name, carrier_account, invoice_number,
 invoice_amount, currency, invoice_date\nfrom invoice_summary where invoice_number in ('BHX3327983',)"

Expected Output "预计 Output "

select carrier_name, carrier_account, invoice_number,
     invoice_amount, currency, invoice_date\nfrom invoice_summary where invoice_number in ('BHX3327983')"

I am looking for a solution that works when there is single input or there mutliple inputs to be passed.我正在寻找一种在有单个输入或要传递多个输入时有效的解决方案。

Whats wrong in my code.我的代码有什么问题。

Try using join and put the parenthesis inside the string:尝试使用join并将括号放在字符串中:

sql1 = '''select carrier_name, carrier_account, invoice_number, invoice_amount, currency, invoice_date
from invoice_summary where invoice_number in ({})'''.format(','.join(["'{}'".format(x) for x in data1['invoice_number']]))

Update更新

You could use the DataFrame.empty property to conditionally set the value of the sql statement.您可以使用DataFrame.empty属性有条件地设置 sql 语句的值。 If data1 is empty, then set your WHERE clause to something that is False, eg 1 = 0 :如果data1为空,则将WHERE子句设置为 False,例如1 = 0

if data1.empty:
    sql1 = '''select carrier_name, carrier_account, invoice_number, invoice_amount, currency, invoice_date
              from invoice_summary where 1 = 0'''
else:
    sql1 = ('''select carrier_name, carrier_account, invoice_number, invoice_amount, currency, invoice_date
              from invoice_summary where invoice_number in ({})'''
            .format(','.join(["'{}'".format(x) for x in data1['invoice_number']])))

To avoid SQL-injection you could use this:为避免 SQL 注入,您可以使用以下命令:

invoice_nums_list = data1['invoice_number'].values.tolist()

sql1 = '''select carrier_name, carrier_account, invoice_number, invoice_amount, currency, invoice_date from invoice_summary where invoice_number in ''' + 
       '(' + ','.join('%s' for i in range(len(invoice_nums_list))) + ')'

print(sql1)

cursor.execute(sql1, params=tuple(invoice_nums_list))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM