如何为“IN 子句”传递可变参数

Posted

技术标签:

【中文标题】如何为“IN 子句”传递可变参数【英文标题】:How to pass variable parameter for "IN clause" 【发布时间】:2017-09-08 08:21:04 【问题描述】:

我正在准备如下的 session.execute 语句。 我的条件很少,只有一个 IN 子句。我收到以下错误。 我知道我做错了,但无法让它发挥作用。filter_site_value = ['filter 1', 'filter 2']

session = get_session()
query = 'SELECT * FROM table where cv = %s AND dt > %s and dt < %s AND st IN  (%s)' % ','.join('%s' for i in filter_site_value)
data = (filter_customer_value,filter_date_start_value, filter_date_end_value, filter_site_value)
rows = session.execute(query, data)

"errorType": "TypeError", "errorMessage": "格式字符串的参数不足"

请帮忙。

【问题讨论】:

不应该是','.join('%s' %i for i in filter_site_value)吗? 甚至无法使用它形成基本查询 【参考方案1】:

您的字符串有 3 个位置需要将值格式化到其中 (%s),您只需提供一个值:','.join('%s' for i in filter_site_value)

如果你有:

x = string_to_format % values

并且 string_to_format 包含 X 数量的 %s(或 %d %r ...),那么您需要 values 中的 X 值

见: https://docs.python.org/2/library/string.html , https://pyformat.info/

你可能想做的是:

query = 'SELECT * FROM table where cv = %s AND dt > %s and dt < %s AND st IN  ('+ ','.join(filter_site_value)+')'
data = (filter_customer_value,filter_date_start_value, filter_date_end_value)

query = 'SELECT * FROM table where cv = %s AND dt > %s and dt < %s AND st IN  ('+ ','.join(%s for i in filter_site_value)+')'
data = (filter_customer_value,filter_date_start_value, filter_date_end_value)+tuple(filter_site_value)

【讨论】:

以上是关于如何为“IN 子句”传递可变参数的主要内容,如果未能解决你的问题,请参考以下文章

可变参数使用

Storefront API:查询可变参数?

python 函数传递可变不可变对象

define可变参数,float数据传输

如何通过使用可变模板参数来专门化元组的类模板?

python—可变对象与不可变对象 参数传递