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
raise 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 行目、execute
self.prepare(query_string)
ファイル "C:\Program Files (x86)\Python\lib\ site-packages\pypyodbc.py"、1174 行目、準備中
if sys.exc_info()[1][0] == '07009':
TypeError: 'DatabaseError' object does not support indexing

インデックス作成をサポートしていないものは何ですか? ステートメントはどのように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、2 番目の例が壊れます。

... 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 に答える