Подключение к базе данных связанного доступа с помощью pyodbc

#python-3.x #ms-access #pyodbc

#python-3.x #ms-access #pyodbc

Вопрос:

Я пытаюсь получить данные из базы данных Microsoft Access. Проблема заключается в количестве ограничений, с которыми я сталкиваюсь:

  1. Я должен использовать 64-битный Python
  2. База данных access состоит из связанных таблиц с другой базой данных
  3. Для другой базы данных требуется 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:

У вас есть два ограничения, которые являются взаимоисключающими:

  1. Я должен использовать 64-битный Python

… и …

  1. Для другой базы данных требуется 32-разрядный драйвер Oracle

64-разрядные процессы не могут использовать 32-разрядные драйверы ODBC; они просто несовместимы. Если остальная часть вашего стека (драйвер Oracle ODBC, приложения Microsoft Office / Access) является 32-разрядной, вам потребуется использовать 32-разрядную версию Python, если вы хотите работать со связанными таблицами, как вы описали.

Дополнительное примечание: ваше утверждение о том, что «для другой базы данных требуется 32-разрядный драйвер Oracle», сомнительно. Клиент-серверные базы данных, такие как Oracle, SQL Server и т. Д., Не особенно заботятся о том, получают ли они запросы от 32-разрядного клиента или 64-разрядного клиента. На стороне клиента могут быть различия в деталях, но это должен выяснить драйвер ODBC (и / или диспетчер драйверов ODBC) на клиенте.