考虑由定义的表
CREATE TABLE Example (id INTEGER)
以及用于向Example
添加元组的INSERT
语句,在SQL注释中有一个单引号:
我通过pyodbc
模块连接到MySQL。令人惊讶的效果似乎是INSERT
命令随后总是失败。注释中有奇数个撇号。消息提到HY000和:
'The SQL contains 0 parameter markers, but 1 parameters were supplied'
更新:该行为现在已经由MySQL支持人员进行了验证,因此有可能被归类为bug。请参阅Gord的答案,其中列出了另一个示例,以及指向MySQL bug数据库的注释。在
下面列出了完整的测试脚本。我想知道这句话是否只是一个抓住了?但奇怪的是:
如果语句文本是通过ODBC传递的,那么假设注释从--
开始并扩展到行尾,这是错误的吗?(我确实在--
后面加了一个空格,我使用SQL注释来实现可移植性。不同的注释字符或MySLQ块注释不会改变效果。)
对ODBC会话的跟踪分别显示下面列出的成功和失败案例的SQLNumParams
,分别为1和0。然而,这些陈述本身看起来是既定的。我试图假设换行符('\n')是无效的。但是下面的工作示例有两个引号(my_cmd_with_two_qutoes
)或没有引号(即my_cmd
用“*”替换“'”)的工作示例与此矛盾。在
还是司机的问题?在
import pyodbc
my_cmd = """-- Comment's device
INSERT INTO Example (id) VALUES (?)
"""
my_cmd_with_two_quotes = """-- Comment's device's
INSERT INTO Example (id) VALUES (?)
"""
conn = pyodbc.connect("DSN=Abcdef;PWD=...")
thing_named_cursor = conn.cursor()
# success, replacing the single apostrophe:
thing_named_cursor.execute(my_cmd.replace("'", "*"), (123, ))
# success, too:
thing_named_cursor.execute(my_cmd_with_two_quotes, (456, ))
# failure:
try:
thing_named_cursor.execute(my_cmd, (789, ))
except pyodbc.Error, e:
print("Error: %s" % e)
conn.commit()
conn.close()
是的。我用以下针对MySQL数据库的测试代码重新创建了您的问题
但是,当DSN指向microsoftsqlserver数据库(使用sqlservernativeclient11.0)时,它可以很好地工作。在
在对MySQL数据库使用pypyodbc时,代码也会失败,因此这不仅仅是pyodbc的问题。在
另外,下面的VBScript代码。。。在
^{pr2}$。。。失败。。。在
。。。但是将命令文本中的
Gord's
改为Gord''s
。。。在。。。允许它运行而无需抱怨。在
附加信息:
据记录,MySQL Connector/Python对问题中的原始注释字符串没有问题。这很好:
你试过屏蔽评论吗?
/* mycomment */
我的猜测是,在这种情况下,MySQL不会将这种语言的新行视为新行;或者连接可能会将“空白”处理到最小,以优化查询的发送(有效地剥离出新行)。在
相关问题 更多 >
编程相关推荐