1

我正在尝试使用 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)值(“201”在第 1 行")

果然,在 MySQL 正常工作的那个中,AIN0 没有被单引号包围,这让我相信这是导致错误的原因。

当我使用字符串插值时,为什么在我的字符串周围插入单引号以及如何让它们停止?

4

1 回答 1

4

如果通过“字符串插值”你的意思是像 Python 的字符串格式,那不是你正在使用的。cursor.execute()做 SQL 参数插入,它有自己的一套规则。发生混淆是因为某些数据库接口(包括 mysqlDB)%s用作占位符......其他数据库接口使用例如?

当您使用参数化 SQL 时,占位符只能出现在 SQL 中可以出现表达式的位置。表名不是表达式。当你的参数是一个字符串时,它用单引号括起来,这样在生成的 SQL 中它看起来就像一个 SQL 字符串文字。这涉及到双引号,例如 Python 中的内容会像SQL 中"O'Brien"的那样显示为字符串文字。'O''Brien'

所以,你不能阻止它用单引号括起来。您需要执行两个步骤:(1)AIN0使用 Python 字符串格式构建一个插入所需位置的 SQL 字符串。(2) 在你的cursor.execute()

于 2011-03-26T04:32:09.117 回答