【问题标题】:Python: Iterating through MySQL columnsPython:遍历 MySQL 列
【发布时间】:2014-10-20 00:27:22
【问题描述】:

我想知道你是否可以帮助我。如果文本与相应的关键字匹配,我正在尝试更改每列中的值。这是循环:

for i in range(0, 20, 1):
    cur.execute("UPDATE table SET %s = 1 WHERE text rlike %s") %(column_names[i], search_terms[i])

MySQL 命令本身可以正常工作,但当我将它放入循环时就不行了。它在第一个 %s 处出错

有人有什么见解吗?

这是错误:

_mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%s = 1 WHERE text rlike %s' at line 1")

列名看起来像

column_names = ["col1","col2","col3"...]

搜索词看起来像

search_terms = ["'(^| |.|-)word1[;:,. ?-]'","'(^| |.|-)word2[;:,. ?-]'",...]

【问题讨论】:

  • 显示 column_names 和 search_terms
  • 为什么会有 range(0, 20, 1)?这与 range(20) 甚至 range(0, 20) 相同

标签: python mysql mysql-python


【解决方案1】:

缺少引号和错误的括号放置...

for i in range(0, 20, 1):
    cur.execute("UPDATE table SET %s = 1 WHERE text rlike '%s'" %(column_names[i], search_terms[i]))
#                                                         ^  ^
#              (-----------------------------------------------------------------------------------)

请注意,这不是正确的做法,如果您的字符串本身可能包含引号...

那又如何呢:

for i in range(0, 20, 1):
    cur.execute("UPDATE table SET %s = 1 WHERE text rlike ?" % (column_names[i],),
                (search_terms[i],))

这使用% 运算符设置列名,但使用executes 参数绑定数据,让DB 驱动程序转义所有需要的字符。

【讨论】:

    【解决方案2】:

    这样做的正确方法是给 Python 赋值,它会正确引用事物。

    改编自航海家的post

    for i in range(0, 20, 1):
        cur.execute("UPDATE table SET {} = 1 WHERE text rlike %s".format(column_names[i]),
                    (search_terms[i],),
                   )
    

    在这种情况下,它会令人困惑,因为column_name 不是一个值,它是表结构的一部分,因此它是使用良好的旧字符串格式插入的。 search_term 是一个值,因此被传递给 cursor.execute() 以进行正确、安全的引用。

    (不要使用字符串操作来添加引号 - 您将自己暴露在 SQL 注入中。)

    【讨论】:

    • 谢谢!这对我有用。我不完全理解你使用的语法,但我现在会花时间,虽然它会进行文本搜索以尝试看看你在那里做了什么。
    猜你喜欢
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 2016-12-08
    • 1970-01-01
    • 2018-03-08
    • 2015-10-07
    相关资源
    最近更新 更多