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

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

  1. Я должен использовать 64-битный Python
  2. База данных доступа состоит из связанных таблиц с другой базой данных.
  3. Для другой базы данных требуется 32-битный драйвер Oracle.

Поэтому у меня есть база данных 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

но это ничего не изменило.

Помогает ли этот совет?

Gord Thompson 10.04.2019 20:13

Это была одна из вещей, на которые я смотрел, но даже когда я отключаю соединения из пула, сообщение об ошибке не меняется.

A. Hudson 10.04.2019 20:28

«это драйвер и соединение, которое база данных доступа использует для подключения к другому источнику данных» — да, но если на вашем компьютере установлен 32-разрядный пакет Office, то MSACCESS.EXE может использовать 32-разрядный драйвер ODBC для Oracle, поскольку он работает в 32-битной подсистеме Windows, тогда как ваше 64-битное приложение Python не может «видеть» 32-битный драйвер Oracle.

Gord Thompson 11.04.2019 21:48

Верно, так что теоретически установка ``` pyodbc.pooling = False ``` должна обойти эту проблему, верно?

A. Hudson 12.04.2019 00:10

Нет, проблема более фундаментальна. Смотрите мой ответ.

Gord Thompson 12.04.2019 02:22
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
669
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

  1. I have to use 64 bit Python

... а также ...

  1. 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) на клиенте.

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