将字符串变量传递给MySQL,失败为元组

时间:2016-03-04 01:52:27

标签: python mysql raspberry-pi2

使用新购买的RaspberryPi,我是Python / MySQL的新手,所以请原谅我发布的天真问题。 我已经看了很多Q& A关于这一点,但我似乎无法理解'为什么'这是失败的。我收到错误:“必须是字符串或只读缓冲区,而不是元组”。如果我用TYPE测试它,我的变量显示为字符串,所以现在我迷路了。

import MySQLdb
import time
db = MySQLdb.connect(host="localhost", user="user",passwd="easypwd", db="imagepi")
cursor = db.cursor()
current_time = time.strftime("%H:%M:%S")
current_date = time.strftime("%Y-%m-%d")
filename = (current_time+'.jpg')
sql = ("""INSERT INTO imagelocator(batch, date, time, filename) VALUES
('1001', current_date, current_time, %s)""", filename)
cursor.execute(sql)
db.commit()
db.close()

非常感谢你为我提供了一个正确的方向。

1 个答案:

答案 0 :(得分:2)

sql变量是一个元组。其中一半是您的SQL语句,另一半是语句中%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)

编辑:我想我没有澄清......虽然用括号括起一个字符串不会创建元组,但添加逗号。因此,(string_var)不是元组,而(string_var,)则是。{1}}。希望这可以消除上述代码如何运作的混淆。

另外,这里有关于星号的一些文件;无聊的官方文档和更容易理解的博客文章: