Таблица запросов с составными первичными ключами - PullRequest
0 голосов
/ 13 января 2020

Я использую pyodbc для подключения к базе данных компьютера и запроса нескольких таблиц в этой базе данных, используя

pandas.read_sql(tbl,cnxn), where tbl = "SELECT * FROM TABLE", cnxn is pyodbc.connect('DSN=DATASOURCE;UID=USERID;PWD=PASSWORD').

. Это работает на большинстве таблиц, но некоторые Возврат таблиц:

Ошибка DatabaseEr: Ошибка при выполнении sql 'SELECT * FROM TABLE': ('42S02', '[42S02] [Microsoft] [ODB C драйвер для Oracle] [Oracle ] ORA-00942: таблица или представление не существует (942) (SQLExecDirectW) ')

Эти таблицы, возвращающие ошибку при открытии в MS Access, имеют несколько столбцов со значком ключа на осталось при открытии в режиме конструктора (таким образом, составной первичный ключ, составленный из нескольких столбцов).

По этой причине у меня возникает ошибка, описанная выше? Как я могу решить эту проблему?

Редактировать : как показано на этом скриншоте, есть несколько столбцов, помеченных как составляющие первичный ключ в режиме конструктора:

enter image description here

Edit2 : Спасибо за отзывы. После проверки окна администратора источника данных ODB C этот источник данных находится на 32-разрядной платформе, а его драйвер - Microsoft ODB C для Oracle.

. Не думаю, что имя таблицы - это проблема, потому что другие таблицы работали, и у них есть то же самое соглашение об именовании (имя таблицы в этом формате NAME_OF_THE_TABLE). Стараясь не показывать имя таблицы, потому что работал над проектом компании.

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

1 Ответ

0 голосов
/ 14 января 2020

Прежде всего, поймите, что MS Access - это уникальный , GUI инструмент, который поддерживает собственную базу данных по умолчанию, JET / ACE Engine, но может подключаться и к другим базам данных, включая Oracle, SQL Сервер Postgres и др. c. через соединения OLEDB / ODB C. По сути, и MS Access, и Python делают одно и то же: устанавливают соединение ODB C с Oracle (действительной базой данных).

Поскольку все связанные таблицы нормально подключаются в MS Access, попробуйте сопоставить соединения и запросы в Python. Вероятно, проблема связана с именами таблиц, подключением схемы или доступом пользователей.

  1. Имя таблицы : Ваша таблица содержит орфографические ошибки или зарезервированные слова или комбинацию прописных или строчных букв, как определено в их CREATE TABLE установка вызывает чувствительность к регистру, поэтому Table, как определено с помощью CREATE TABLE "Table", отличается от TABLE. По этой причине используйте точное имя в связанной таблице MS Access и заключите в двойные кавычки.

    pandas.read_sql('SELECT * FROM "Table"', cnxn)
    

    (Обратите внимание: двойные кавычки в SQL полностью отличаются от двойных кавычек в Python и не взаимозаменяемы с одинарными кавычками.)

  2. Подключенная схема / пользователь : неверная схема. Поскольку схемы в Oracle являются более или менее пользователями, у вас может быть несколько соединений для ваших связанных таблиц MS Access. Хотя все они указывают на один и тот же сервер базы данных с одним и тем же драйвером ODB C, каждый пользователь отличается различными базовыми таблицами. Для разрешения сопоставьте соединение Python ODB C с подключением MS Access ODB C:

    Строка подключения MS Access находится в следующих разделах: «Конструкция таблицы» (из панели навигации)> «Таблица свойств» ( из ленты)> Описание. Используйте это в вызове pyodbc.connect(...). Скорее всего, только uid и pwd будут отличаться при работе между схемами.

  3. Непривилегированный пользователь : у подключенного пользователя нет select привилегия для этой таблицы.

...