Как сделать параметризованные запросы, используя pypyodbc в Python?

Я открываю 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()

Как только я выполняю следующий код, я получаю следующую ошибку:

Traceback (последний вызов был последним):
Файл "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(состояние, err_text)
pypyodbc.DatabaseError: ('07009', '[07009] [Microsoft] [Драйвер ODBC SQL Server] Индекс недопустимого дескриптора')

Во время обработки вышеупомянутого исключения произошло другое исключение:

Traceback (последний вызов был последним):
Файл "\MFRAME\Data\Profiles\Arsene\Desktop\query.py", строка 7, в
cursor.execute('выберите 1 где? =?', ['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 ответ

Решение

Я немного поиграл с этим, и я думаю, что в pypyodbc должна быть ошибка, из-за которой он не работает, как предполагает документация:

В большинстве случаев вы можете просто попробовать pypyodbc в вашем существующем скрипте с поддержкой pyodbc со следующими изменениями

Например, я запустил этот код с 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 не работает для этого варианта использования, либо его документация неверна. Если я смогу выяснить, что я сообщу об ошибке.

Другие вопросы по тегам