Python和MySQL:传递列表/元组

时间:2018-08-09 14:32:03

标签: python mysql pymysql

我正在用Python构建查询以传递给pymysql查询。

condition=['m']
query = "select * from table where condition in {}'.format(tuple(condition))

我要坚持的部分是我想设置脚本以在condition可以是单个项目或具有多个项目的情况下工作。

在我看来,将列表转换为元组是可行的,但这样做不可行,因为: tuple(condition) 返回: ('m',) ,无法在我的mysql服务器上工作。

最简单的设置方法是,我可以将单个值或多个值发送到python构建的查询上的where子句中?

5 个答案:

答案 0 :(得分:1)

使用多个条件的最简单方法是为单个“ where”使用格式字符串:

fmtstr = "select * from table where condition in {} "

以及要添加的内容:

addstr = "or condition in {} "

并根据需要连接它们。

对于元组,您可以像使用列表一样处理内部项目:

x = (1, 'a')
x[0] == 1  #evaluates True
x[1] == 'a'  #same

答案 1 :(得分:1)

您可能必须将其作为字符串传递,并让您的sql server完成其余工作。 您是否尝试过:

query = "select * from table where condition in {}'.format(str(tuple(condition)))`

答案 2 :(得分:0)

我相信这可以解决您的问题:

condition=['m', 'n']

def quoteWrap(path):
    return '"' + path + '"'

query = "select * from table where condition in ({})".format(','.join([quoteWrap(c) for c in condition]))
query
#select * from table where condition in ("m","n")

显然,我还添加了quoteWrap函数,将您的字符串用引号引起来。

答案 3 :(得分:0)

我可以想到的另一种技巧是替换查询的最后一部分。

如果您只有一个元素,通常会出现此问题,即像这样('m',)

为什么不这样做:

condition = ['m']
queryString = 'SELECT o_id FROM orders WHERE o_k_id IN ' + str(tuple(condition))
queryString = queryString.replace(',)', ')')
print(queryString)

因此您的查询将如下所示:

select * from table where condition in ('m')

如果您必须将多个值传递到where条件,则仍然适用:

condition = ['m', 'n']
queryString = 'select * from table where condition in ' + str(tuple(condition))
queryString = queryString.replace(',)', ')')
print(queryString)

输出:

select * from table where condition in ('m', 'n')

答案 4 :(得分:0)

所以我走了一条不同的路,因为这些建议太麻烦了,或者没有用。

对我有用的解决方案是: cond = ', '.join('"{0}"'.format(w) for w in condition)

,然后查询为: select * from table where condition in ({})。format(cond)`

这将生成一串用逗号分隔的值,每个值都用引号引起来。示例:

condition = ['baseline', 'error']
cond = ', '.join('"{0}"'.format(w) for w in condition)   
#"baseline","error"  
query = select * from table where condition in ({})`.format(cond)   
# select * from table where condition in ("baseline","error")