如何将* columns *列表传递给MySQLDb执行

时间:2013-10-07 13:50:31

标签: python mysql mysql-python

可以pass a tuple to MySQLdb for use in an IN clause,但是可以传递tuple作为列列表吗?这不起作用:

cursor.execute("SELECT %s FROM users", tuple(columns))
OperationalError: (1241, 'Operand should contain 1 column(s)')

似乎execute不会对列表进行语法识别替换。

2 个答案:

答案 0 :(得分:0)

丑陋但功能性:

cursor.execute(
    "SELECT %s FROM users" % \
    ', '.join('`' + MySQLdb.escape_string(column) + '`' for column in columns))

答案 1 :(得分:0)

你在这里尝试做的事情有一些问题,首先让我们来看看元组会是什么样子:

>>> columns = ['a','b','c']
>>> tuple(columns)
('a', 'b', 'c')
>>>

正如您所看到的,元组将包含与列表相同数量的元素,但在您的查询中,您只有一个%s。因此列计数问题。其次,如果你添加正确的%s数,光标会将元素转换为字符串并转义它们:

>>> cur.execute("SELECT %s,%s,%s FROM a", tuple(columns))
2L
>>> cur.fetchall()
(('a', 'b', 'c'), ('a', 'b', 'c'))
>>>

然后你会收到文字作为值而不是预期的列名。我不相信这个实例,使用参数选项可以产生你期望的结果。

可能的方法是使用标准字符串方法创建查询:

>>> query = "SELECT %s FROM a" % ",".join(columns)
>>> query
'SELECT a,b,c FROM a'
>>>

然后将此查询传递给游标。