2

我正在发现 Python,但遇到了一个我不明白的错误。

正如我从示例中了解到的那样,使用参数查询 SQL Server 数据库时,方法是:

import pypyodbc

connectionString = 'DRIVER={SQL Server};SERVER=VSQL001;DATABASE=Tests;Trusted_Connection=yes'

connection = pypyodbc.connect(connectionString)
cursor = connection.cursor()
cursor.execute('select 1 where ? = ?', [1, 2]);
cursor.close()
connection.close()

一旦我执行以下代码,我就会收到以下错误:

回溯(最后一次调用):
文件“C:\Program Files (x86)\Python\lib\site-packages\pypyodbc.py”,第 1171 行,在准备
check_success(self,ret)
文件“C:\Program Files (x86)\Python\lib\site-packages\pypyodbc.py",第 937 行,在 check_success
ctrl_err(SQL_HANDLE_STMT, ODBC_obj.stmt_h, ret, ODBC_obj.ansi)
文件“C:\Program Files (x86)\Python\lib \site-packages\pypyodbc.py",第 919 行,在 ctrl_err 中
引发 DatabaseError(state,err_text)
pypyodbc.DatabaseError: ('07009', '[07009] [Microsoft][ODBC SQL Server Driver]Invalid Descriptor Index')

在处理上述异常的过程中,又出现了一个异常:

回溯(最后一次调用):
文件“\MFRAME\Data\Profiles\Arsene\Desktop\query.py”,第 7 行,在
cursor.execute('select 1 where ? = ?', ['1', '2 ']);
文件“C:\Program Files (x86)\Python\lib\site-packages\pypyodbc.py”,第 1398 行,在执行
self.prepare(query_string)
文件“C:\Program Files (x86)\Python\lib\ site-packages\pypyodbc.py",第 1174 行,
如果 sys.exc_info()[1][0] == '07009':
TypeError:'DatabaseError' 对象不支持索引

什么不支持索引?我应该如何正确地写execute声明?

4

1 回答 1

3

我已经玩了一点,我认为 pypyodbc 中一定存在一个错误,使其不像文档建议的那样运行:

在大多数情况下,您只需在现有 pyodbc 驱动的脚本中尝试 pypyodbc 并进行以下更改

例如,我运行了这段代码,pyodbc一切正常:

... import pyodbc as db
... conn = db.connect(connect_string)
... cursor = conn.cursor()
>>> # One parameter
... res = cursor.execute("SELECT 1 WHERE 1=?", [1,])
... print(cursor.fetchall())
[(1, )]
>>> # Two parameters
... res = cursor.execute("SELECT 2 WHERE ?=?", [1, 1])
... print(cursor.fetchall())
[(2, )]
>>> conn.close()

但是将导入行切换到pypyodbc会破坏第二个示例:

... import pypyodbc as db
... conn = db.connect(connect_string)
... cursor = conn.cursor()
>>> # One parameter
... res = cursor.execute("SELECT 1 WHERE 1=?", [1,])
... print(cursor.fetchall())
[(1,)]
>>> # Two parameters
... res = cursor.execute("SELECT 2 WHERE ?=?", [1, 1])
... print(cursor.fetchall())
Traceback (most recent call last):
...
TypeError: 'DatabaseError' object does not support indexing
>>> conn.close()

所以我不认为这是你做错了什么;此用例的 pypyodbc 已损坏或其文档错误。如果我能弄清楚我会提交一个错误。

于 2013-05-19T17:31:32.070 回答