【问题标题】:cx_Oracle LDAP Connection String syntaxcx_Oracle LDAP 连接字符串语法
【发布时间】:2021-05-19 21:26:43
【问题描述】:

使用 JDBC,我们可以使用以下语法通过 LDAP 连接连接到 Oracle 数据库:

jdbc:oracle:thin:@ldap://host:1234/service_name,cn=OracleContext,dc=org,dc=com

如何使用 cx_oracle 通过 LDAP 进行连接?

【问题讨论】:

  • 你有想过这个吗?
  • @TygerGuzman 是的,不能在 cx_Oracle(或底层 OCI 库)中使用 LDAP 字符串语法。如果你想在 cx_Oracle 中使用 LDAP,你必须使用下面 Anthony 提到的 ldap.ora 文件。

标签: python python-2.7 cx-oracle


【解决方案1】:

我最终选择了 jaydebeapi。

import pandas as pd 
import jaydebeapi
import jpype
import os
import sys

def run(f_name,command,username,pw ):
    jar='ojdbc8.jar'
    args = '-Djava.class.path=%s' % jar
    jvm_path = jpype.getDefaultJVMPath()
    jpype.startJVM(jvm_path, args)
    con = jaydebeapi.connect("oracle.jdbc.driver.OracleDriver", "jdbc:oracle:thin:@ldap://server.prod.company.com:3060/service,cn=OracleContext,dc=prod,dc=company,dc=com",[username, pw], jar)
    try:
        df= pd.read_sql(command,con)
        df.to_excel(f_name)
        print(df)
    except Exception as e:
        print(e)
    finally:
        con.close()



def Run_Program(myvars):
    os.chdir(sys._MEIPASS)    
    f_name = myvars.MyFileName
    command = myvars.plainTextEdit_CSVString.toPlainText()
    username = myvars.lineEdit_UserName.text()
    pw = myvars.lineEdit_Password.text()
    run(f_name,command,username,pw )

将 Oracle 客户端中的 ojdbc8.jar 文件保存在同一文件夹中,并在代码中指定位置。并且还将模块 JPype1 降级为 JPype1==0.6.3 (它作为 jaydebeapi 的要求安装)

这对于使用 pyinstaller 进行打包非常有效,因此可以共享。 (我创建了一个 pyqt5 UI 供用户使用。

【讨论】:

    【解决方案2】:

    这是我在 Win 10 上使用 Python 3.7 和 cx_Oracle v.8.2.0 的两分钱。

    我想使用 Python 向 Oracle 数据库发出查询,而我已经拥有的是:

    • 用户名(或架构)
    • 密码
    • 如下所示的 JDBC 连接字符串: jdbc:oracle:thin:@ldap://[LDAPHostname1]:[LDAPPort1]/[ServiceName],[DomainContext] ldap://[LDAPHostname2]:[LDAPPort2]/[ServiceName],[DomainContext] 其中[DomainContext] 的形式为cn=OracleContext,dc=foo,dc=bar

    首先,您必须按照Oracle documentation 安装cx_Oracle。

    请注意:

    • cx_Oracle 需要一系列库文件,这些库文件是 Oracle Instant Client“基本”或“基本轻”包(here)的一部分。假设我们在C:\path\to\instant_client_xx_yy下解压包
    • 根据您所在的平台,需要满足一些其他要求(例如在 Windows 上安装一些 Visual Studio 可再发行组件)

    对于 LDAP 部分,需要两个配置文件:

    • sqlnet.ora:这是 Oracle 的配置文件配置文件,但我的只是包含:

      NAMES.DIRECTORY_PATH = (LDAP)
      

      它告诉库仅使用 LDAP 解析名称。

    • ldap.ora :此文件告诉您在使用 LDAP 解析名称时要查找的位置。我知道我正在访问两个 OID 服务器,所以我的形式是:

      DIRECTORY_SERVERS=([LDAPHostname1]:[LDAPPort1], [LDAPHostname2]:[LDAPPort2])
      DEFAULT_ADMIN_CONTEXT="dc=foo,dc=bar"
      DIRECTORY_SERVER_TYPE=oid
      

      重要提示:我必须从 DEFAULT_ADMIN_CONTEXT 条目中删除 cn=OracleContext 才能使名称解析工作

      假设这两个文件保存在C:\path\to\conf

    现在是 Python 部分。我使用cx_Oracle.init_oracle_client() 方法来指向库和配置文件。 (请注意,还有其他方法可以让 cx_Oracle 访问这些文件,例如设置环境变量或将它们放在预定义的位置。这在 install guide 下进行了解释)

    这是一个小示例代码:

    
    import cx_Oracle
    
    # username and password retrieved here
    
    cx_Oracle.init_oracle_client(lib_dir=r'C:\path\to\instant_client_xx_yy', config_dir=r'C:\path\to\conf')
    
    try:
        with cx_Oracle.connect(user=username, password=password, dsn='[ServiceName]') as connection:
            cursor = connection.cursor()
            cursor.execute('SELECT * FROM ALL_TAB_COLUMNS')
            # Outputs tables and columns accessible by the user
            for row in cursor:
                print(row[1], '-', row[2])
            cursor.close()
    
    except cx_Oracle.DatabaseError as e:
        print("Oracle Error", e)
    

    【讨论】:

      【解决方案3】:

      简短的回答是您使用 ldap.ora 配置文件并指定要在您的 sqlnet.ora 配置文件中使用它。尽管此链接讨论的是创建数据库链接而不是直接连接,但原理相同,您可以使用 LDAP 服务器中引用的任何服务进行连接。

      http://technologydribble.info/2015/02/10/how-to-create-an-oracle-database-link-using-ldap-authentication/

      有关其工作原理的更多官方文档可在此处找到:

      https://docs.oracle.com/cd/B28359_01/network.111/b28317/ldap.htm

      【讨论】:

      • 如果我的应用程序应该被封闭,并且不能依赖客户端的文件怎么办?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-11
      • 2021-02-02
      • 1970-01-01
      相关资源
      最近更新 更多