【问题标题】:An Example of MySQL update query using python 3.4使用 python 3.4 的 MySQL 更新查询示例
【发布时间】:2015-03-30 15:06:41
【问题描述】:

如何使用 python 3.4 编写 MySQL 更新查询? 我使用 pymysql 作为连接器,我想更新托管在本地主机上的数据库中的表。

我编写了一小段代码,但它显示错误。可能是因为它与 python 3.4 不兼容。

sql1 = ("""
          UPDATE field_data_comment_body SET  Sentiments=%s
            WHERE comment_body_value=%s """, (para3,res))
    cursor.execute(sql1)

执行此操作时显示错误

Traceback (most recent call last):
  File "F:\The Script\new.py", line 44, in <module>
    cursor.execute(sql1)
  File "C:\Python34\lib\site-packages\pymysql-0.6.6-py3.4.egg\pymysql\cursors.py", line 134, in execute
    result = self._query(query)
  File "C:\Python34\lib\site-packages\pymysql-0.6.6-py3.4.egg\pymysql\cursors.py", line 282, in _query
    conn.query(q)
  File "C:\Python34\lib\site-packages\pymysql-0.6.6-py3.4.egg\pymysql\connections.py", line 767, in query
    self._execute_command(COMMAND.COM_QUERY, sql)
  File "C:\Python34\lib\site-packages\pymysql-0.6.6-py3.4.egg\pymysql\connections.py", line 957, in _execute_command
    self._write_bytes(prelude + sql[:chunk_size-1])
TypeError: can't concat bytes to tuple

TypeError:无法将字节连接到元组

所以请帮我找出错误!

【问题讨论】:

    标签: python mysql python-3.x


    【解决方案1】:

    Vaultah 的回答非常好,但我个人更喜欢将查询字符串与数据分开。发生在我身上的事情似乎更清楚了。

    sql1 = "UPDATE field_data_comment_body SET Sentiments=%s WHERE comment_body_value=%s"
    data = (para3, res)
    cursor.execute(sql1, data)
    

    【讨论】:

    • 谢谢它的工作!但唯一的问题是值没有存储在数据库中。我会尝试在网络上搜索它。但如果你发现有问题,请帮助我....无论如何,非常感谢你的帮助:-)
    • 得到了答案! :-D 我没有使用 db.commit() ,这是值没有被存储的唯一错误! :)
    【解决方案2】:

    简答

    cursor.execute("""
        UPDATE field_data_comment_body 
        SET  Sentiments = ? 
        WHERE comment_body_value = ?
        """, (para3, res))
    

    解释版

    首先:您的代码中有一些错误。

    如果您想要 SQL 的 Python 字符串,您可能需要使用 string.format(format_string, params) 或 字符串插值 - format_string % (params) 用于多个参数或format_string % param 用于单个参数.

    我假设您选择了第二个选项。下面是它的样子:

    sql1 = ("""UPDATE field_data_comment_body SET Sentiments=%s
            WHERE comment_body_value=%s""" % (para3,res))
    

    第二:您的 SQL 查询出现错误。如果您尝试匹配 WHERE 条件中的字符串值 - 您必须用引号将该值括起来。与SET 值相同。

    试试这个:

    sql1 = """UPDATE field_data_comment_body SET Sentiments = '%s'
            WHERE comment_body_value = '%s'""" % (para3,res)
    

    这不会导致 Python 或 SQL 错误。

    但请注意:如果您的参数 para3 和 res 可能被最终用户以某种方式替换,您可能会遇到 SQL 注入问题!

    最后,第三点:不要使用原始 SQL 查询 - 你可以将参数(para3 和 res)传递给 cursor.execute() 方法,让他安全地包装你的参数 - 不再需要考虑在哪里您需要或不使用引号。

    那就试试这个吧:

    cursor.execute("""
        UPDATE field_data_comment_body 
        SET  Sentiments = ? 
        WHERE comment_body_value = ?
        """, (para3, res))
    

    我相信这是最好的选择。

    【讨论】:

    • 首先:您基本上是在建议允许 SQL 注入。第二:引号在这里无关紧要。
    • @vaultah 是的,你是对的。将其更改为使用更多的prepare-statement-style =)
    • @AnttiHaapala 我已经解决了这个问题——刚刚提到应该如何进行字符串插值
    • 请在不正确的代码(&lt;s&gt;&lt;/s&gt;)上加上删除线之类的,快速阅读器不明显;并重新格式化最后一个代码块,以便无需滚动即可看到非常重要的部分。
    • @AnttiHaapala 代码不正确 - 它只是可能不安全。但我会尽力而为 =)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    相关资源
    最近更新 更多