cx_Oracle LDAP 连接字符串语法
cx_Oracle LDAP Connection String syntax
使用 JDBC,我们可以使用以下语法通过 LDAP 连接连接到 Oracle 数据库:
jdbc:oracle:thin:@ldap://host:1234/service_name,cn=OracleContext,dc=org,dc=com
如何使用 cx_oracle 通过 LDAP 连接?
简短的回答是您使用 ldap.ora 配置文件并指定它要在 sqlnet.ora 配置文件中使用。尽管此 link 讨论的是创建数据库 link 而不是直接连接,但同样的原则适用,您可以使用 LDAP 服务器中引用的任何服务进行连接。
可以在此处找到有关其工作原理的更多官方文档:
https://docs.oracle.com/cd/B28359_01/network.111/b28317/ldap.htm
我最终选择了 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 供用户使用。
这是我在 Win 10 上使用 Python 3.7 和 cx_Oracle v.8.2.0 的两分钱。
我想使用 Python 向 Oracle 数据库发出查询,而我已经拥有的是:
- 用户名(或架构)
- 密码
- a 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“Basic”或“Basic Light”包的一部分(可用 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)
使用 JDBC,我们可以使用以下语法通过 LDAP 连接连接到 Oracle 数据库:
jdbc:oracle:thin:@ldap://host:1234/service_name,cn=OracleContext,dc=org,dc=com
如何使用 cx_oracle 通过 LDAP 连接?
简短的回答是您使用 ldap.ora 配置文件并指定它要在 sqlnet.ora 配置文件中使用。尽管此 link 讨论的是创建数据库 link 而不是直接连接,但同样的原则适用,您可以使用 LDAP 服务器中引用的任何服务进行连接。
可以在此处找到有关其工作原理的更多官方文档:
https://docs.oracle.com/cd/B28359_01/network.111/b28317/ldap.htm
我最终选择了 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 供用户使用。
这是我在 Win 10 上使用 Python 3.7 和 cx_Oracle v.8.2.0 的两分钱。
我想使用 Python 向 Oracle 数据库发出查询,而我已经拥有的是:
- 用户名(或架构)
- 密码
- a 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“Basic”或“Basic Light”包的一部分(可用 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)