我有一些我想要更改的数据(unixtime - >人类日期时间)。 之后,如何动态更新mysql上的结果。
>>> print data
((1424794931452.0,), (1424794931645.0,), (1424794931821.0,), (1424794932014.0,), (1424794932189.0,)
for i in data:
dt = datetime.fromtimestamp(i[0] // 1000)
s = dt.strftime('%Y-%m-%d %H:%M:%S')
sql2 = "UPDATE accelerometer SET test = "+ s +"WHERE _id="+i
cursor.execute(sql2)
data = cursor.fetchall()
print (s)
这是错误消息。
TypeError: cannot concatenate 'str' and 'tuple' objects
我想动态更新Mysql上的结果数据。但是有一些问题。有什么问题?
2015-02-24 11:22:11
2015-02-24 11:22:11
2015-02-24 11:22:11
2015-02-24 11:22:12
2015-02-24 11:22:12
答案 0 :(得分:1)
使用id循环元组,而不是id列表:
((1424794931452.0,), (1424794931645.0,), (1424794931821.0,), (1424794932014.0,), (1424794932189.0,)
因此每个i
都设置为其中一个元组。 提取 ID,方法是使用索引或在for
循环分配中添加逗号:
for i in data:
dt = datetime.fromtimestamp(i[0] // 1000)
s = dt.strftime('%Y-%m-%d %H:%M:%S')
sql2 = "UPDATE accelerometer SET test = " + s + "WHERE _id=" + i[0]
cursor.execute(sql2)
或
for i, in data:
dt = datetime.fromtimestamp(i // 1000)
s = dt.strftime('%Y-%m-%d %H:%M:%S')
sql2 = "UPDATE accelerometer SET test = " + s + "WHERE _id=" + i
cursor.execute(sql2)
你应该在这里使用SQL参数而不是字符串连接;然后,您可以重用 SQL语句:
sql2 = "UPDATE accelerometer SET test = ? WHERE _id=?"
for i, in data:
dt = datetime.fromtimestamp(i // 1000)
cursor.execute(sql2, (i, dt))
我做了两个假设:你的数据库驱动程序使用?
作为占位符语法(它可能是%s
)并且它本身支持datetime
个对象(这些天大多数都可以),因此您不需要先使用datetime.strftime()
来生成字符串。
语句重用可以更进一步,因为数据库只需要解析一次查询,并且只需要生成一个查询计划;这加速了重复执行。
使用SQL参数还有另一个非常重要的优势:它可以防止SQL注入攻击(攻击者添加引用和其他SQL语句)。对于您的特定输入而言,这并不是一个值得关注的问题,但应始终牢记在心。
答案 1 :(得分:0)
你的核心问题是你正在尝试组合一个自给自足的字符串(在你的情况下使用字符串连接,字符串插值的问题更常见,但它几乎是同一个问题)。
相反,使用占位符:
sql2 = "UPDATE accelerometer SET test = %s WHERE _id= %s"
然后将数据传递给execute
:
cursor.execute(sql2, (s, i))
这将为你做正确的事。
当然,构建正确的独立字符串虽然很棘手,但这样做仍然是非常错误,请参阅https://xkcd.com/327/和不要将自己暴露给SQL注入风险:使用execute
中的占位符和数据吧!
答案 2 :(得分:0)
您的数据存储在元组中。并且错误消息表明字符串和元组不能组合为字符串,因为元组不是字符串。
而不是:
sql2 = "UPDATE accelerometer SET test = "+ s +"WHERE _id="+i
尝试:
sql2 = "UPDATE accelerometer SET test = "+ s +"WHERE _id=%f" % i
我不建议使用%s
来构建字符串,因为这可能会改变浮点值的格式。