You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中同时连接两个Oracle数据库执行跨库关联查询?

在Python中用cx_Oracle实现Oracle跨库关联查询的解决方案

方法一:利用Oracle数据库链接(DB Link)—— 贴近你给出的SQL写法

这种方式和Oracle SQL Developer里的跨库查询逻辑完全一致,核心是让其中一个Oracle库能直接访问另一个库,Python只需要连接其中一个库即可执行跨库SQL。

步骤:

  1. 创建数据库链接
    先在其中一个数据库(比如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即可。

  2. 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完成关联。

步骤:

  1. 分别连接两个库并提取数据

    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()
    
  2. 本地执行数据关联

    # 按id_client做内关联,和你给出的SQL逻辑一致
    result_df = pd.merge(df1, df2, on="id_client", how="inner")
    
    # 输出结果
    print(result_df)
    

两种方法对比

  • 方法一:性能更优,关联逻辑在数据库端执行,适合大数据量场景;但需要数据库权限创建DB Link。
  • 方法二:无需数据库权限,但需将数据拉到Python本地处理,适合小数据量场景,大数据量时可能出现内存不足或速度慢的问题。

内容的提问来源于stack exchange,提问作者ignacio tz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 18:52:37