繁体   English   中英

在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方法中的参数替换仅用于数据 - 正如您所发现的那样。 这在文档中并不十分明确,但它是大多数数据库驱动程序实现它的方式。

要注意在参数替代的意图是很重要的executeexecutemany方法是没有一个不必担心格式化Python对象为字符串到数据库,并使用转义和报价,从而使SQL注入变得困难(如果不是不可能的)关于几个逃生的地方。

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

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

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

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

这个例子展示了使你的例子工作的最简单方法 - 只需在代码中编写它就可以轻松读取和维护 - 例如,为语句使用额外的变量,并在调用execute之前调用format 但那只是风格。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM