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

Using a variable as field name in MySQLdb, 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()

好的,这是回溯:

           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")

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

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

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

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

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

                '''.format(sql_col_name) ,
                (fgi, ici)) 

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