可以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
不会对列表进行语法识别替换。
答案 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'
>>>
然后将此查询传递给游标。