来自 SQL 服务器和 Oracle 的内部连接查询与 Python

Inner join query from SQL Server and Oracle with Python

假设我有这样的查询:

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

我已经使用 Cx_Oracle 和 pyodbc 在 python 中建立了游标连接到它们各自的数据库。个人查询效果很好。我可以做的子查询。但是这个带有内部连接的查询需要连接到 Oracle 和 SQL 服务器我迷路了。我如何分解它或以编程方式处理它?

我当前的版本涉及创建临时表,但这只适用于 SQL 服务器,不适用于 Oracle!目标是使用游标连接到各自的服务器(目前可以完成)但是然后呢?

简单地说,您不能 运行 跨远程数据库进行查询,就好像它们是本地 table 一样。在数据库连接的每个游标中,其范围仅限于连接服务器、模式或您指定的 catalog/database。只有那些对象(tables、functions/procedures 等)可用。无法识别任何其他内容。

话虽如此,现在大多数关系数据库都支持外部服务器连接,包括 Oracle 的 Database Links, SQL Server's Linked Servers, DB2's Catalog, Postgres' Foreign Data Wrappers, MySQL's Federated Storage Engine, MS Access' Linked Tables, SQLite's ATTACH(但仅其他 SQLite 数据库)。

因此,考虑在 Oracle 或 SQL 服务器中建立远程连接,然后如果允许连接用户访问,运行 需要的 JOIN 查询。下面是连接和查询的非常简单的例子。研究合适的连接参数。另外,请记住 Oracle 模式(仅用户)不同于 SQL 服务器模式(对象的命名空间容器)。

甲骨文

A database link is a connection between two physical database servers that allows a client to access them as one logical database.

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 服务器

A linked server allows for access to distributed, heterogeneous queries against OLE DB data sources. After a linked server is created, distributed queries can be run against this server, and queries can join tables from more than one data source.

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 中的备选方案,如果上述证明太难或需要高级特权许可:

  • 在任一侧创建临时 table 并通过 cursor.fetchcursor.executecursor.executemany 转储远程 table 记录,然后运行 JOIN 本地查询。

  • 将 table 导入 SQLite 数据库(磁盘或内存实例)和 运行 JOIN 查询。注意:在 Python 3 中,sqlite3 是标准库的一部分,因此随 Python 安装一起提供。

  • 使用 Pythons 的第三方模块 pandas,将 tables 导入数据框和 运行 merge (对应 SQL 的 JOIN)。与 sqlalchemy, pandas can even dump data frames in one call to databases using to_sql.

  • 交互