如何在Python中同时连接两个Oracle数据库执行跨库关联查询?
在Python中用cx_Oracle实现Oracle跨库关联查询的解决方案
方法一:利用Oracle数据库链接(DB Link)—— 贴近你给出的SQL写法
这种方式和Oracle SQL Developer里的跨库查询逻辑完全一致,核心是让其中一个Oracle库能直接访问另一个库,Python只需要连接其中一个库即可执行跨库SQL。
步骤:
创建数据库链接
先在其中一个数据库(比如database_1)上创建指向另一个数据库(database_2)的DB Link,需要有CREATE DATABASE LINK权限:CREATE DATABASE LINK database_2 CONNECT TO username_of_db2 IDENTIFIED BY password_of_db2 USING 'tns_alias_of_db2';也可以用完整TNS字符串替代
tns_alias_of_db2,避免依赖本地tnsnames.ora配置:CREATE DATABASE LINK database_2 CONNECT TO username_of_db2 IDENTIFIED BY password_of_db2 USING '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=db2_host)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=db2_service_name)))';若需要从
database_2访问database_1,同理在database_2上创建对应DB Link即可。Python中执行跨库查询
现在只需用cx_Oracle连接到带有DB Link的库(比如database_1),直接执行你提供的SQL:import cx_Oracle # 连接database_1 dsn = cx_Oracle.makedsn("db1_host", 1521, service_name="db1_service_name") conn = cx_Oracle.connect(user="username_of_db1", password="password_of_db1", dsn=dsn) # 执行跨库关联查询 sql = """ SELECT t1.id_client, t1.sales, t2.cost FROM table_1 t1 JOIN table_2@database_2 t2 ON t1.id_client = t2.id_client """ cursor = conn.cursor() cursor.execute(sql) # 遍历输出结果 for row in cursor: print(row) # 关闭资源 cursor.close() conn.close()
方法二:Python端分别连接两个库,本地关联数据
如果没有权限创建DB Link,可以分别连接两个数据库,查询出数据后在Python本地用pandas完成关联。
步骤:
分别连接两个库并提取数据
import cx_Oracle import pandas as pd # 连接database_1并查询table_1 dsn_db1 = cx_Oracle.makedsn("db1_host", 1521, service_name="db1_service_name") conn_db1 = cx_Oracle.connect(user="username_of_db1", password="password_of_db1", dsn=dsn_db1) df1 = pd.read_sql("SELECT id_client, sales FROM table_1", conn_db1) conn_db1.close() # 连接database_2并查询table_2 dsn_db2 = cx_Oracle.makedsn("db2_host", 1521, service_name="db2_service_name") conn_db2 = cx_Oracle.connect(user="username_of_db2", password="password_of_db2", dsn=dsn_db2) df2 = pd.read_sql("SELECT id_client, cost FROM table_2", conn_db2) conn_db2.close()本地执行数据关联
# 按id_client做内关联,和你给出的SQL逻辑一致 result_df = pd.merge(df1, df2, on="id_client", how="inner") # 输出结果 print(result_df)
两种方法对比
- 方法一:性能更优,关联逻辑在数据库端执行,适合大数据量场景;但需要数据库权限创建DB Link。
- 方法二:无需数据库权限,但需将数据拉到Python本地处理,适合小数据量场景,大数据量时可能出现内存不足或速度慢的问题。
内容的提问来源于stack exchange,提问作者ignacio tz
相关产品推荐
相关产品推荐

