#python-3.x #ms-access #pyodbc
#python-3.x #ms-access #pyodbc
Вопрос:
Я пытаюсь получить данные из базы данных Microsoft Access. Проблема заключается в количестве ограничений, с которыми я сталкиваюсь:
- Я должен использовать 64-битный Python
- База данных access состоит из связанных таблиц с другой базой данных
- Для другой базы данных требуется 32-разрядный драйвер Oracle
Таким образом, у меня есть база данных Access, хранящаяся локально, и я пытаюсь подключиться к ней с помощью PyODBC.
Я пытался оглядеться и разобраться со строкой подключения, но эта проблема кажется довольно уникальной.
В настоящее время это модифицированная версия того, что у меня есть:
import pyodbc
dbPATH = r'C:pathtodatabase.accdb'
UID = 'username'
PWD = 'username'
driver = r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};'
credentials = r'DBQ=%s;UID=%s;PWD=%s'%(dbPATH, UID, PWD)
conn_str = driver credentials
connection = pyodbc.connect(conn_str)
cursor = connection.cursor()
cursor.execute("select * from [table_name];")
for row in cursor.fetchone():
print(row)
Это ошибка, которую я обычно получаю:
pyodbc.Error: ('HY000', "[HY000] [Microsoft][ODBC Microsoft Access Driver] ODBC--connection to '{Oracle in OraClient11g_home1_32bit}' failed. (-2001) (SQLExecDirectW)")
Что удивительно, поскольку это драйвер и соединение, которые база данных access использует для подключения к другому источнику данных.
Я попытался установить
pyodbc.pooling = False
но это ничего не изменило.
Комментарии:
1. Помогает ли этот совет ?
2. Это была одна из вещей, на которые я смотрел, но даже когда я отключаю объединенные соединения, сообщение об ошибке не меняется
3. «это драйвер и соединение, которые база данных access использует для подключения к другому источнику данных» — Да, но если на вашем компьютере установлен 32-разрядный Office, то MSACCESS.EXE может использовать 32-разрядный драйвер ODBC для Oracle, поскольку он работает в 32-разрядной подсистеме Windows, тогда как ваш 64-разрядное приложение Python не может «видеть» 32-разрядный драйвер Oracle.
4. Правильно, так что теоретически установка « pyodbc.pooling = False « должна обойти эту проблему, верно?
5. Нет, проблема более фундаментальна. Смотрите мой ответ.
Ответ №1:
У вас есть два ограничения, которые являются взаимоисключающими:
- Я должен использовать 64-битный Python
… и …
- Для другой базы данных требуется 32-разрядный драйвер Oracle
64-разрядные процессы не могут использовать 32-разрядные драйверы ODBC; они просто несовместимы. Если остальная часть вашего стека (драйвер Oracle ODBC, приложения Microsoft Office / Access) является 32-разрядной, вам потребуется использовать 32-разрядную версию Python, если вы хотите работать со связанными таблицами, как вы описали.
Дополнительное примечание: ваше утверждение о том, что «для другой базы данных требуется 32-разрядный драйвер Oracle», сомнительно. Клиент-серверные базы данных, такие как Oracle, SQL Server и т. Д., Не особенно заботятся о том, получают ли они запросы от 32-разрядного клиента или 64-разрядного клиента. На стороне клиента могут быть различия в деталях, но это должен выяснить драйвер ODBC (и / или диспетчер драйверов ODBC) на клиенте.