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