我按照这个教程配置的oracle client
但配置完后用cx_Oracle远程连接oracle数据库仍然报以下错误,错误提示instantclient_19_8里面无lib文件夹下的libclntsh.dylib,但官网下载的驱动里面就没有lib文件夹
以下是本机一些基本信息:
oracle驱动路径:/Users/jimyau/Library/OracleClient/instantclient_19_8
环境变量:
export ORACLE_HOME=/Users/jimyau/Library/OracleClient/instantclient_19_8
export PATH=$ORACLE_HOME:$PATH
mac系统版本:macos 13.5,m1芯片
python版本:anaconda内置的python3.11,安装的是x86_64版本,没有用arm版本的anaconda
请教下是哪一步出错了吗,按照教程配置python死活连不上oracle数据库
【相关推荐】
检查python版本:在CMD通过python命令查看python版本
选择合适的 cx-Oracle库:可以在这里找到合适的版本 https://www.lfd.uci.edu/~gohlke/pythonlibs/#cx_oracle
选择合适的Oracle Client:
https://www.oracle.com/database/technologies/instant-client/downloads.html主要看这三点
正确安装了适用于您的操作系统版本的Oracle Client
确保您的系统环境变量中已经包含了Oracle Client的路径。
import cx_Oracle
# 连接信息
username = "your_username"
password = "your_password"
host = "your_host"
port = "your_port"
service_name = "your_service_name"
# 构建连接字符串
dsn = cx_Oracle.makedsn(host, port, service_name=service_name)
# 连接数据库
connection = cx_Oracle.connect(username, password, dsn)
# 在此之后可以执行查询等操作
问题点:DPI-1047 错误
思路分析:DPI-1047 错误是由于 Oracle Instant Client 环境变量未正确设置或配置引起的。
在使用 cx_Oracle 库连接到 Oracle 数据库时,需要正确设置以下环境变量:
ORACLE_HOME:指向 Oracle Instant Client 的安装路径。
LD_LIBRARY_PATH(对于 Linux/Unix 系统)或 PATH(对于 Windows 系统):包含 Oracle Instant Client 库文件的路径。
编辑bash_profile配置文件
bash_profile 文件是每个用户的个人配置文件,因此每个用户都可以在其自己的主目录下找到该文件。如果你希望对所有用户生效,可以编辑 /etc/bashrc 或 /etc/profile 文件。
注意:记得在修改配置文件之前备份原始文件,以防意外情况发生。此外,请确保你了解你所做的更改可能产生的影响,并小心操作。
# 编辑bash_profile配置文件
vi ~/.bash_profile
# 添加下面内容,instantclient_19_8就是我们刚才所放文件的路径
export ORACLE_HOME=/Users/wangyu/Library/OracleClient/instantclient_19_8
export PATH=$ORACLE_HOME:$PATH
# 保存退出后再刷新下环境变量
source ~/.bash_profile
参考gpt:
结合自己分析给你如下建议:
你的Python和Oracle Client的位数不一致,例如你的Python是64位的,而你的Oracle Client是32位的,或者反之。你需要确保它们的位数相同,否则会出现兼容性问题。
你的Oracle Client的路径没有正确设置,导致Python无法找到它。你需要将Oracle Client的路径添加到环境变量中,例如LD_LIBRARY_PATH(Linux)或者PATH(Windows)。
你的Oracle Client的版本不支持你的Oracle Database的版本,例如你的Oracle Client是11g的,而你的Oracle Database是12c或者更高的。你需要升级你的Oracle Client到一个合适的版本,或者使用Instant Client Basic Light,它可以支持更多版本的Oracle Database。
为了解决这个问题,你可以尝试以下几个步骤:
检查你的Python和Oracle Client的位数是否一致,如果不一致,你需要重新安装一个相同位数的版本。你可以使用python -c "import platform; print(platform.architecture())"命令来查看你的Python的位数,以及使用file命令来查看你的Oracle Client库文件(libclntsh.so)的位数。
检查你是否已经将Oracle Client的路径添加到环境变量中,如果没有,你需要将它添加到LD_LIBRARY_PATH(Linux)或者PATH(Windows)中,并重新启动Python。例如,在Linux上,你可以使用export LD_LIBRARY_PATH=/opt/oracle/instantclient_19_8:$LD_LIBRARY_PATH命令来设置环境变量,其中/opt/oracle/instantclient_19_8是你解压缩Instant Client包的路径。
检查你是否使用了cx_Oracle.init_oracle_client(lib_dir=…)函数来指定Oracle Client库文件的路径,如果没有,你可以在导入cx_Oracle模块之后调用这个函数,并传入正确的路径作为参数。例如,在Linux上,你可以使用cx_Oracle.init_oracle_client(lib_dir="/opt/oracle/instantclient_19_8")命令来指定路径。
检查你是否使用了正确的连接字符串来连接数据库,如果不正确,你需要修改它。一般来说,连接字符串有以下几种格式:
Easy Connect: cx_Oracle.connect("user/password@host:port/service_name")
TNS: cx_Oracle.connect("user/password@tns_name")
DSN: cx_Oracle.connect("user", "password", "dsn_name")
Connection Object: cx_Oracle.connect(connection)
其中,host是数据库服务器的主机名或者IP地址,port是数据库服务器监听端口,默认是1521,service_name是数据库服务名或者SID,tns_name是TNSNAMES.ORA文件中定义的名称,dsn_name是cx_Oracle.makedsn()函数返回的值,connection是cx_Oracle.Connection类型的对象。
python的库版本对一下