Внутренний запрос соединения от SQL Server и Oracle с Python - PullRequest
1 голос
/ 11 декабря 2019

Допустим, у меня есть такой запрос:

SELECT Oracle.Column1, SqlServer.Column1
FROM SqlServer
INNER JOIN Oracle
on SqlServer.ID = Oracle.ID

Я установил соединения курсора в python с соответствующими базами данных, используя Cx_Oracle и pyodbc. Отдельные запросы работают отлично. Подзапросы я могу сделать. Но этот запрос с внутренним объединением, который требует как соединения с Oracle, так и SQL Server, я потерял. Как мне разбить это или подойти к этому программно?

Моя текущая версия включает создание временных таблиц, но это работает только в SQL Server, а не в Oracle! Цель состоит в том, чтобы использовать курсоры для подключения к соответствующим серверам (в настоящее время можно выполнить), но что тогда?

1 Ответ

2 голосов
/ 11 декабря 2019

Просто вы не можете выполнить запрос к удаленным базам данных, как если бы они были локальными таблицами. Внутри каждого курсора соединения с базой данных его юниверс ограничивается указанным вами сервером, схемой или каталогом / базой данных. Доступны только те объекты (таблицы, функции / процедуры и т. Д.). Ничто за пределами не распознается.

С учетом вышесказанного большинство реляционных баз данных сегодня поддерживают соединения с внешними серверами, включая Oracle Database Links , SQL Server Linked Servers , DB2 Каталог , Postgres ' Оболочки сторонних данных , MySQL Объединенный механизм хранения , MS Access' Связанные таблицы , SQLite ATTACH (нотолько другие базы данных SQLite).

Поэтому рассмотрите возможность установки удаленного соединения в Oracle или SQL Server, а затем, если подключающемуся пользователю разрешен доступ, выполните необходимый запрос JOIN. Ниже приведены очень простые примеры подключения и запросов. Сделайте свое исследование для соответствующих параметров подключения. Кроме того, помните, что схема Oracle (только пользователь) отличается от схемы SQL Server (контейнера пространства имен объектов).

Oracle

База данныхссылка - это соединение между двумя физическими серверами баз данных, которое позволяет клиенту обращаться к ним как к одной логической базе данных.

CREATE PUBLIC DATABASE LINK ... USING 'mssql_db';  -- TO BE RUN ONCE

SELECT o.Column1, s.Column1
FROM oracle_local_table o
INNER JOIN mssql_db.sql_server_remote_table s
  ON s.ID = o.ID

SQL Server

Связанный сервер обеспечивает доступ к распределенным гетерогенным запросам к источникам данных OLE DB. После создания связанного сервера к этому серверу можно запускать распределенные запросы, и запросы могут объединять таблицы из более чем одного источника данных.

EXEC master.dbo.sp_addlinkedserver           -- TO BE RUN ONCE
       @server = N'oracle_server', 
       @srvproduct=N'...', 
       @provider=N'...', 
       @provstr=N'...'

SELECT o.Column1, s.Column1
FROM oracle_server..user.oracle_remote_table o
INNER JOIN sql_server_local_table s
  ON s.ID = o.ID

-- ALTERNATIVELY
SELECT o.Column1, s.Column1
FROM OPENQUERY (oracle_server, 'SELECT * FROM scott.oracle_remote_table') o
INNER JOIN sql_server_local_table s
  ON s.ID = o.ID 

Альтернативы в Python, если приведенные выше, оказываются слишком сложными или требуют привилегированного разрешения высокого уровня:

  • Создайте временную таблицу с любой стороны исоздайте дамп записей удаленных таблиц через cursor.fetch и cursor.execute или cursor.executemany, а затем выполните локальный запрос JOIN.

  • Импортируйте обе таблицы в базу данных SQLite (на диске или в памяти)экземпляр) и выполните запрос JOIN. Примечание: в Python 3 sqlite3 является частью стандартной библиотеки и, следовательно, поставляется с установками Python.

  • Используйте сторонний модуль Python, pandas, для импорта обеих таблиц в фреймы данных изапустить merge (аналог SQL JOIN). Взаимодействуя с sqlalchemy , pandas может даже выгружать кадры данных за один вызов базы данных, используя to_sql.

...