如何在Python中使用pyodbc进行参数化查询?

时间:2013-05-19 15:08:26

标签: python sql-parametrized-query

我发现了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语句?

1 个答案:

答案 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对于这个用例是破坏的,或者它的文档是错误的。如果我能弄清楚哪个我会提交错误。