我发现了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驱动程序]无效的描述符索引')在处理上述异常期间,发生了另一个异常:
追踪(最近的呼叫最后):
文件“\ 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行,准备中 if sys.exc_info()[1] [0] =='07009':
TypeError:'DatabaseError'对象不支持索引
什么不支持索引?我该如何正确编写execute
语句?
答案 0 :(得分:2)
我已经玩过这个了,我认为pypyodbc中必定存在一个错误,使其不像documentation建议的那样:
在大多数情况下,您可以在现有的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对于这个用例是破坏的,或者它的文档是错误的。如果我能弄清楚哪个我会提交错误。