使用ODBC时,我可以在SQL注释中添加任意文本吗?

2024-03-29 09:59:37 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑由定义的表

CREATE TABLE Example (id INTEGER)

以及用于向Example添加元组的INSERT语句,在SQL注释中有一个引号:

^{pr2}$

我通过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()

Tags: cmdid示例sqlexamplemywithmysql
2条回答

Or is it a driver issue?

是的。我用以下针对MySQL数据库的测试代码重新创建了您的问题

import pyodbc
cnxn = pyodbc.connect("DSN=usbMySQL")
crsr = cnxn.cursor()
sql = """
  Comment's device
INSERT INTO Example (id) VALUES (?)
"""
crsr.execute(sql, [11])
cnxn.commit()
cnxn.close()

但是,当DSN指向microsoftsqlserver数据库(使用sqlservernativeclient11.0)时,它可以很好地工作。在

在对MySQL数据库使用pypyodbc时,代码也会失败,因此这不仅仅是pyodbc的问题。在

另外,下面的VBScript代码。。。在

^{pr2}$

。。。失败。。。在

[MySQL][ODBC 5.2(w) Driver][mysqld-5.6.13-log]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 '?)' at line 2

。。。但是将命令文本中的Gord's改为Gord''s。。。在

cmd.CommandText = _
    "  Gord''s test" & vbCrLf & _
    "INSERT INTO Example (id) VALUES (?)"

。。。允许它运行而无需抱怨。在

附加信息:

据记录,MySQL Connector/Python对问题中的原始注释字符串没有问题。这很好:

import mysql.connector
cnxn = mysql.connector.connect(port=3307, user='root', password='whatever', database='mydb')
crsr = cnxn.cursor()
sql = """
  Comment's device
INSERT INTO Example (id) VALUES (%s)
"""
crsr.execute(sql, [101])
cnxn.commit()
cnxn.close()

你试过屏蔽评论吗?/* mycomment */

我的猜测是,在这种情况下,MySQL不会将这种语言的新行视为新行;或者连接可能会将“空白”处理到最小,以优化查询的发送(有效地剥离出新行)。在

相关问题 更多 >