我正在使用 python 的 pyodbc 库来连接 Oracle 数据库。对我的非生产服务器的身份验证设置为基本身份验证,因此我的连接字符串运行良好。
一开始很难理解和设置正确的驱动程序,但后来确实成功了。以下是用于连接的代码,并且在我的其他服务器上运行良好。
import textwrap
import pyodbc
connection_string = textwrap.dedent('''Driver={driver};
DBQ={hostname}:{port}/{sid};
UID={username};
PWD={password};
Connection Timeout=30;
Trusted_Connection="yes"
'''.format(driver = 'Oracle in instantclient_11_2',
hostname = <hostname>,
port = <port>,
sid = <sid>,
username = <username>,
password = <passwd>
))
connection = pyodbc.connect(connection_string)
令我惊讶的是,PROD 仅通过 LDAP 进行身份验证。我拥有 LDAP 服务器、上下文和数据库服务以及凭据。
我尝试将连接字符串创建为
connection_string = textwrap.dedent('''Driver={driver};
DBQ={hostname}:{port}/{sid};
UID={username};
PWD={password};
Connection Timeout=30;
Authentication=LDAP;
Trusted_Connection="yes"
'''.format(driver = 'Oracle in instantclient_11_2',
hostname = <ldap_server>,
port = 389,
sid = <db_service>,
username = <username>,
password = <passwd>
))
知道它行不通,我并不感到惊讶。尝试通过许多链接但无法通过。有没有人以前试过这个,或者请让我知道我必须缺少什么。
我绝对可以使用 LDAP 身份验证在 SQL Developer 中进行连接。由于此服务器上未配置 TNS 侦听器,因此我无法使用基本身份验证进行连接。
欢迎在这方面提供帮助。
答案 0 :(得分:0)
设置 Oracle 驱动程序 - (这是一个先决条件,如果存在请忽略)
下载适用于 Microsoft Windows (x64) 64 位的 Oracle Instant Client。或者下载适用于您的 32 位系统。
选择您的 Oracle 数据库版本。我的版本是 11.2.0.4.0
下载以下文件 - 一世。即时客户端包 - 基本 ii.即时客户端包 - ODBC
将两个软件包解压到同一目录中,例如 C:\oracle\instantclient_19_3。
从 Instant Client 目录执行 odbc_install.exe。如果 Instant Client 是 11g 或更低版本,请使用管理员权限启动命令提示符。
创建 C:\oracle\instantclient_19_3\network\admin
文件夹以放置 tnsnames.ora、sqlnet.ora。
将环境变量 - TNS_ADMIN 设置为上述文件夹位置。
将 C:\oracle\instantclient_19_3
添加到 PATH
环境变量。
将 C:\oracle\instantclient_19_3
添加到 ORACLE_HOME
(可选,如果连接不起作用,请尝试此操作。)
LDAP 身份验证
sqlnet.ora
和 ldap.ora
ldap.ora
# Place this file in the network/admin subdirectory or your
# $ORACLE_HOME location.
# LDAP Server name should be added here. Rest all the values remains unchanged.
DIRECTORY_SERVERS = (your-server.your-organization:389:636)
DEFAULT_ADMIN_CONTEXT = "ldap-ou-designation"
DIRECTORY_SERVER_TYPE = OID
sqlnet.ora
# Place this file in the network/admin subdirectory or your
# $ORACLE_HOME location.
SQLNET.AUTHENTICATION_SERVICES=(NTS)
NAMES.DIRECTORY_PATH = (LDAP)
C:\oracle\instantclient_19_3
是否存在于路径中,否则尝试更新 Python 代码中的路径,如下所示import os
lib_dir=r"C:\oracle\instantclient_19_3"
os.environ["PATH"] = lib_dir + ";" + os.environ["PATH"]
使用 cx_Oracle
import cx_Oracle
con = cx_Oracle.connect('{0}/{1}@{2}'.format(user, password, db_service))
version_script = "SELECT * FROM v$version"
cursor = con.cursor()
cursor.execute(version_script)
version = cursor.fetchall()
print(version[0][0])
Ouput
-----
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
使用 pyodbc
import pyodbc
con = pyodbc.connect('Driver={0};DBQ={1};UID={2};PWD={3}'.format(driver, db_service, user, password))
version_script = "SELECT * FROM v$version"
cursor = con.cursor()
cursor.execute(version_script)
version = cursor.fetchall()
print(version[0][0])
Ouput
-----
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
#Drivers for pyodbc
pyodbc.drivers()
Output
------
['ODBC Driver 17 for SQL Server',
'Oracle in instantclient_11_2']
参考资料:
https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html https://www.oracle.com/database/technologies/releasenote-odbc-ic.html https://eikonomega.medium.com/connecting-to-oracle-database-with-cx-oracle-and-ldap-5da7925a305c