字符串插值导致MysqlDB错误

时间:2011-03-26 04:13:46

标签: python mysql string interpolation mysql-python

我正在尝试使用mysqlDB,但是我遇到了一个对我来说根本没有意义的问题。

我的问题集中在以下执行语句中的表名。

这有效:

c.execute(u'''insert into AIN0 (Date_Info, Raw_Data, Calculation_Formula, Calculated_Data) values (%s, %s, %s, %s)''',
                        (str(date), int(raw), int(formula), 0.1))

这些都不起作用:

c.execute(u'''insert into %s (Date_Info, Raw_Data, Calculation_Formula, Calculated_Data) values (%s, %s, %s, %s)''',
                        (str("AIN0"), str(date), int(raw), int(formula), 0.1))
c.execute(u'''insert into 'AIN0' (Date_Info, Raw_Data, Calculation_Formula, Calculated_Data) values (%s, %s, %s, %s)''',
                        (str(date), int(raw), int(formula), 0.1))

问题是,两个非工作的都会导致相同的错误消息:

  

ProgrammingError:(1064,“你的SQL语法有错误;查看与你的MySQL服务器版本相对应的手册,以便在附近使用正确的语法   ''AIN0'(Date_Info,Raw_Data,Calculation_Formula,Calculated_Data)值('2011'在第1行“)

请注意,在错误消息中,AIN0被单引号括起来,即使在我使用字符串插值运算符插入它的情况下也是如此。可以肯定的是,我在工作案例中犯了一个故意的语法错误,以便了解MySQL的用途。

  

ProgrammingError:(1064,“你的SQL语法有错误;查看与你的MySQL服务器版本相对应的手册,以便在'附近使用正确的语法'))   AIN0(Date_Info,Raw_Data,Calculation_Formula,Calculated_Data)值(第1行'201')

果然,在MySQL正常使用的那个中,AIN0没有被单引号包围,这让我相信这就是造成错误的原因。

为什么在使用字符串插值时会在字符串中插入单引号,如何让它们停止?

1 个答案:

答案 0 :(得分:4)

如果通过“字符串插值”表示像Python的字符串格式,那不是你正在使用的。 cursor.execute()执行SQL参数插入,它有自己的一组规则。之所以会出现混淆,是因为某些数据库接口(包括mysqlDB)使用%s作为占位符...其他数据库接口使用例如?

使用参数化SQL时,占位符只能出现在SQL中可以出现表达式的位置。表名不是表达式。当你的参数是一个字符串时,它被包装在单引号中,以便在结果SQL中它看起来像一个SQL字符串文字。这包括将单引号加倍,例如Python中出现的字符串文字如"O'Brien"在SQL中变为'O''Brien'

所以,你不能阻止它包装它周围的单引号。您需要执行两个步骤:(1)使用Python字符串格式化构建一个SQL {1}}的SQL字符串。 (2)在AIN0

中使用该SQL字符串