【问题标题】:Connect to Oracle database using python from a Linux server (lxv)从 Linux 服务器 (lxv) 使用 python 连接到 Oracle 数据库
【发布时间】:2022-01-18 00:08:22
【问题描述】:

在我的本地机器上

我在 python 中创建了一个从 Oracle 数据库检索数据的脚本。 使用 cx_Oracle 完成与数据库的连接:

con = cx_Oracle.connect (username, password, dbService)

使用 SQL developer 时,连接是使用 自定义 JDBC 建立的。

在 Linux 服务器上复制过程。

  • 我创建了一个安装了 cx-Oracle pip 的 python 虚拟环境。
  • 我在服务器上安装了Oracle Client 19.3.0,instantclient文件夹就位。

当我尝试按原样执行 python 脚本时,出现以下错误。

cx_Oracle.DatabaseError: DPI-1047: 找不到 64 位 Oracle 客户端库: DPI-1047:找不到 64 位 Oracle 客户端库:“libclntsh.so:无法打开共享对象文件:没有这样的文件或目录”。请参阅https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html 寻求帮助

我认为问题出在 Oracle 路径上,这不是 python 所期望的。因此,我添加了这行额外的代码,以精确定位 Oracle 库所在的路径。

cx_Oracle.init_oracle_client(lib_dir=r"/apps/oracle/product/19.3.0/lib")

这会导致另一个错误:

cx_Oracle.DatabaseError:尝试检索错误文本时出错 ORA-01804

有什么线索吗?

【问题讨论】:

    标签: python linux oracle cx-oracle


    【解决方案1】:

    cx_Oracle initialization doc 指出在 Linux 上 init_oracle_client() 并没有真正做到你认为的那样。在 Python 进程开始之前,您仍然必须设置系统库搜索路径以包含 Oracle 库。

    我是否正确理解装有 Python 的机器已安装 DB 和 Instant Client??

    如果您确实希望 Python 使用 Instant Client 库,请将 LD_LIBRARY_PATH 设置为其位置,然后设置 ORACLE_HOME。

    如果您在使用 Python 的机器上安装了完整的 Oracle DB,则可以删除 Instant Client。在启动 Python 之前,您需要设置 ORACLE_HOME、LD_LIBRARY_PATH 和其他任何需要的东西 - 通常运行 source /usr/local/bin/oraenv。这应该将系统库搜索路径设置为包括 /apps/oracle/product/19.3.0/lib 。像这样(未经测试)的代码 sn-p 可能会有所帮助:export ORACLE_SID=ORCLCDB;set ORAENV_ASK=NO; source /usr/local/bin/oraenv。确保 Python 进程对 ORACLE_HOME 目录具有读取权限。

    cx_Oracle installation guide 讨论了这一切。

    【讨论】:

    • 感谢克里斯托弗的反馈。每当在 Linux 上使用完整的 Oralce 客户端时,确实需要 init_oracle_client(),但在此之前定义一个 LD_LIBRARY_PATH,如果没有生成 ORA-01804。答案可以在cx_Oracle_initialization_doc的“使用cx_Oracle.init_oracle_client()设置Oracle客户端目录”部分找到答案:cx-oracle.readthedocs.io/en/latest/user_guide/…
    • 您需要在 shell 中设置 LD_LIBRARY_PATH,而不是在 Python 脚本中。后者什么都不做。
    • 你是对的,文档中提到应该在启动 Python 之前定义路径,所以这是最佳方式。不过,正如我在使用 os.environ 的回答中所显示的那样,您可以仅使用 python 而不是 shell 来设置路径。
    【解决方案2】:

    ORA-1804 消息表明我的问题的答案。

    根据Oracle初始化文档:https://cx-oracle.readthedocs.io/en/latest/user_guide/initialization.html#usinginitoracleclient

    注意如果你在Linux及相关平台上设置了lib_dir,你还必须 已将系统库搜索路径配置为包括 启动 Python 之前的目录。

    在任何操作系统上,如果您设置 lib_dir 到完整数据库或完整客户端的库目录 安装时,您需要事先设置 Oracle 环境,例如通过设置 ORACLE_HOME 环境 多变的。否则你会得到像 ORA-1804 这样的错误。你应该设置 this 和其他 Oracle 环境变量,在启动 Python 之前, 如甲骨文所示

    即使定义 ORACLE_HOME 应该在启动 Python 之前完成(根据 Oracle 文档),也可以通过修改 Python 脚本本身来完成。所以在 oracle 客户端初始化命令之前必须添加以下命令:

    import os
    # Setup Oracle paths 
    os.environ["ORACLE_HOME"] = '/apps/oracle/product/19.3.0'
    os.environ["ORACLE_BASE"] = '/apps/oracle'
    os.environ["ORACLE_SID"] = 'orcl'
    os.environ["LD_LIBRARY_PATH"] = '/apps/oracle/product/19.3.0/lib'
    
    import cx_Oracle
    # Initialize Oracle client
    cx_Oracle.init_oracle_client(lib_dir=r"/apps/oracle/product/19.3.0/lib")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-24
      • 1970-01-01
      • 2015-12-12
      • 1970-01-01
      • 2016-06-30
      • 1970-01-01
      相关资源
      最近更新 更多