The sql
变量是一个元组。一半是你的 SQL 语句,另一半是 token 值%s
语句中的参数。但是,简单地将元组传递给参数不会将其分解并使用元组中的每个元素作为单独的参数。为此,您必须使用星号:function_to_call(*tuple_args)
...但我认为您也会遇到问题,因为数据库游标需要一个字符串statement
参数,以及一个序列parameters
争论。这parameters
参数必须是序列(元组、列表、集合等)即使只有一个值.
TL;DR - 你需要做更多类似这样的事情:
sql = "INSERT INTO table_name (a_column, b_column) VALUES ('asdf', %s)"
args = (filename,)
cursor.execute(sql, args)
...或者,如果你真的想耍花招,对所有内容都使用元组:
sql = ("INSERT INTO table_name (a_column, b_column) VALUES ('asdf', %s)", (filename,))
cursor.execute(*sql)
编辑:我想我没有澄清...虽然用括号括起来的字符串不会创建元组,但添加逗号does. So, (string_var)
不是元组,而(string_var,)
是。希望这能消除对上述代码如何运行的任何困惑。
另外,这里还有一些关于星号的文档;既有无聊的官方文档,也有更容易理解的博客文章: