0

It's possible to pass a tuple to MySQLdb for use in an IN clause, but is it possible to pass a tuple for use as a column list? This doesn't work:

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

It seems like execute does not do syntax-aware replacement of lists.

4

2 回答 2

0

Ugly but functional:

cursor.execute(
    "SELECT %s FROM users" % \
    ', '.join('`' + MySQLdb.escape_string(column) + '`' for column in columns))
于 2013-10-07T13:50:31.370 回答
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'
>>>

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

于 2013-10-07T14:35:44.733 回答