在python中,如何动态更新变量?

时间:2015-03-29 03:50:59

标签: python dynamic sql-update

我有一些我想要更改的数据(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

3 个答案:

答案 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来构建字符串,因为这可能会改变浮点值的格式。