如何为“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 子句”传递可变参数的主要内容,如果未能解决你的问题,请参考以下文章