python,如何动态更新变量?

In python, How to update variable dynamically?

我有一些数据想要更改(unixtime -> human date time)。 之后,如何动态更新 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

你的核心问题是你试图组合一个自给自足的字符串(在你的情况下字符串连接,字符串 interpolation 的问题更常见,但它是几乎相同的问题)。

而是使用占位符:

sql2 = "UPDATE accelerometer SET test = %s WHERE _id= %s"

然后将数据传递给execute:

cursor.execute(sql2, (s, i))

哪个会为你做正确的事。

当然,构建正确的独立字符串是可能的,尽管很棘手 -- 但这样做仍然 非常 错误,请参阅 https://xkcd.com/327/永远不要 暴露自己!SQL-注入风险:使用 execute 中的占位符和数据!

您正在使用一个 ID 遍历元组,而不是一个 ID 列表:

((1424794931452.0,), (1424794931645.0,), (1424794931821.0,), (1424794932014.0,), (1424794932189.0,)

所以每个 i 都设置为这些元组之一。 通过使用索引或在 for 循环分配中添加逗号来提取 id:

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陈述)。对于您的具体输入,这不是什么大问题,但应始终牢记。

您的数据存储在元组中。并且错误消息说字符串和元组不能组合为字符串,因为元组不是字符串。

而不是:

sql2 = "UPDATE accelerometer SET test = "+ s +"WHERE _id="+i

尝试:

sql2 = "UPDATE accelerometer SET test = "+ s +"WHERE _id=%f" % i

我不建议使用 %s 来构建字符串,因为这可能会改变浮点值的格式。