来自 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.fetch
和 cursor.execute
或 cursor.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
.
交互
假设我有这样的查询:
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.fetch
和cursor.execute
或cursor.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 usingto_sql
. 交互