Я пытаюсь получить данные из базы данных Microsoft Access. Проблема заключается в количестве ограничений, в которых я нахожусь:
Поэтому у меня есть база данных Access, хранящаяся локально, и я пытаюсь подключиться к ней с помощью PyODBC.
Я пытался осмотреться и возиться со строкой подключения, но эта проблема кажется довольно уникальной.
В настоящее время это модифицированная версия того, что у меня есть:
import pyodbc
dbPATH = r'C:\path\to\database.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)")
Что удивительно, поскольку это драйвер и соединение, которые база данных доступа использует для подключения к другому источнику данных.
Я попытался установить
pyodbc.pooling = False
но это ничего не изменило.
Это была одна из вещей, на которые я смотрел, но даже когда я отключаю соединения из пула, сообщение об ошибке не меняется.
«это драйвер и соединение, которое база данных доступа использует для подключения к другому источнику данных» — да, но если на вашем компьютере установлен 32-разрядный пакет Office, то MSACCESS.EXE может использовать 32-разрядный драйвер ODBC для Oracle, поскольку он работает в 32-битной подсистеме Windows, тогда как ваше 64-битное приложение Python не может «видеть» 32-битный драйвер Oracle.
Верно, так что теоретически установка ``` pyodbc.pooling = False ``` должна обойти эту проблему, верно?
Нет, проблема более фундаментальна. Смотрите мой ответ.
У вас есть два ограничения, которые являются взаимоисключающими:
- I have to use 64 bit Python
... а также ...
- The other database requires a 32 bit Oracle driver
64-разрядные процессы не могут использовать 32-разрядные драйверы ODBC; они просто не совместимы. Если остальная часть вашего стека (драйвер Oracle ODBC, приложения Microsoft Office/Access)) является 32-разрядной, вам потребуется использовать 32-разрядную версию Python, если вы хотите работать со связанными таблицами, как вы описано.
Дополнительное примечание. Ваше заявление о том, что «для другой базы данных требуется 32-разрядный драйвер Oracle», сомнительно. Базы данных клиент-сервер, такие как Oracle, SQL Server и т. д., не особенно заботятся о том, получают ли они запросы от 32-разрядного клиента или от 64-разрядного клиента. Могут быть различия в деталях на стороне клиента, но это должен выяснить драйвер ODBC (и/или диспетчер драйверов ODBC) на клиенте.
Помогает ли этот совет?