我正在尝试使用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没有被单引号包围,这让我相信这就是造成错误的原因。
为什么在使用字符串插值时会在字符串中插入单引号,如何让它们停止?
答案 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