在 MySQLdb 中使用变量作为字段名称,Python 2.7

Mik*_* C. 1 python mysql-python python-2.7

当我用实际的列名称替换列变量时,这是有效的。不过我确实需要一个变量。当我使用变量时,出现 MySQL 语法错误。字段可以是变量吗?如果是的话,错误在哪里?

conn = self.create_connection()
        cur = conn[0]
        db = conn[1]

        cur.execute('''
                        UPDATE coefficients

                        SET %s = %s 
                        WHERE coef_id = %s

                    ''' , (sql_col_name, fgi, ici))  
        db.commit()
Run Code Online (Sandbox Code Playgroud)

好的,这是回溯:

           raise errorclass, errorvalue
_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 ''base_rpm' = 3500 WHERE coef_id = 460' at line 1")
Run Code Online (Sandbox Code Playgroud)

jsb*_*eno 5

问题在于 execute方法中的参数替换仅用于数据 - 正如您所发现的。这在文档中并不是很明确,但这是大多数数据库驱动程序实现它的方式。

需要注意的是,executeandexecutemany方法中参数替换的目的是将 Python 对象格式化为数据库的字符串,并应用转义和引号,这样 SQL 注入就会变得很困难(如果不是不可能的话),而不必担心几个问题。放置转义的地方。

当您需要使用变量列名(或改变 SQL 语句的其他部分)时,需要使用 Python 的字符串格式化方法来格式化字符串 - 并以合适的方式保留结果字符串,以用作合适的参数数据替换,在第二次替换中(以便类型转换和引用仍然由驱动程序执行)。

为了避免必须转义%s参数本身的条目,您可以使用与运算符不同的字符串插值方法% ,例如,较新的format字符串方法:

  cur.execute('''
                    UPDATE coefficients
                    SET {} = %s 
                    WHERE coef_id = %s

                '''.format(sql_col_name) ,
                (fgi, ici)) 
Run Code Online (Sandbox Code Playgroud)

此示例展示了使您的示例工作的最简单方法 - 只需将其编写在代码中,以便易于阅读和维护 - 例如,为语句使用额外的变量,并在format调用execute. 但这只是风格。