将Python连接到Oracle

6 投票
3 回答
10328 浏览
提问于 2025-04-17 07:02

我安装了Oracle客户端和Oracle客户端开发包,并且设置了ORACLE_HOME这个环境变量。但是当我尝试安装tux_oracle(用python setup.py build命令)时,出现了以下错误:致命错误:oci.h文件找不到。

3 个回答

1

我正在使用 cx_oracle 来连接我的Oracle数据库。你试过这个吗?

1

这个头文件可以在开发工具包里找到。出于某种原因,它没有包含在默认的安装包里。你可以看看这个链接:

http://my.opera.com/onyxluo/blog/cannot-find-oci-h-in-oracle9-2-client

为了方便你,我把页面内容也放在这里。我是从谷歌缓存里找到的,因为我去的时候那个页面已经打不开了。

这个问题的原因是因为在Oracle9.2客户端中没有安装OCI(Oracle调用接口)包。通常情况下,"oci.h"文件的默认路径是$ORACLE_HOME/rdbms/demo。这个问题在Oracle数据库9.2.0.1版本中不存在。但是在Oracle 9.2.0.1客户端中,即使你选择了完整的客户端安装包,OCI包也没有包含在内。

解决办法:

  1. 首先安装Oracle 9.2.0.1客户端。
  2. 在OUI(Oracle通用安装程序)中,使用与Oracle 9.2.0.1客户端相同的Oracle主目录,然后选择安装Oracle数据库。
  3. 在数据库安装中选择自定义安装。
  4. 取消勾选企业管理器、Oracle数据库和其他选项,只保留OCI和OCCI。

安装完OCI后,$ORACLE_HOME/rdbms/demo目录下会包含oci.h和其他*.h文件。

6

好的,答案是要安装 cx_Oracle,而不是 tx_Oracle。在 Ubuntu 系统上,步骤如下:

  1. 你需要在电脑上安装 Oracle 客户端。如果没有,可以从 Oracle 的网站上下载,链接是 http://www.oracle.com/technetwork/topics/linuxsoft-082809.html
  2. 在你的电脑上安装 alien,这样你才能把 rpm 文件转换成 deb 文件:
sudo apt-get -i alien
  1. 把 rpm 文件转换成 deb 文件:
sudo alien -d oracle-instantclient11.2-sqlplus-11.2.0.2.0.i386.rpm
  1. 安装
    sudo dpkg -i oracle-instantclient11.2-basic_11.2.0.2.0-2_i386.deb
  2. 在 /etc/profile.d 目录下设置 ORACLE_HOME 环境变量,创建一个名为 oracle.sh 的文件,文件内容需要包含:
export ORACLE_HOME=/usr/lib/oracle/11.2/client
source oracle.sh
  1. 更新 LD_LIBRARY_PATH:
sudo vi /etc/ld.so.conf.d/oracle.conf which must contain:  
"$ORACLE_HOME/lib"
sudo ldconfig
  1. 根据你使用的 Oracle 和 Python 的版本,从 http://cx-oracle.sourceforge.net/ 下载并安装 cx_Oracle。再次使用 alien 将 rpm 转换为 deb 并安装:
sudo alien -d cx_Oracle-5.1-11g-py32-1.i386.rpm
sudo dpkg -i cx-oracle_5.1-2_i386.deb
  1. cx_Oracle 会安装在 /usr/lib/python2.7/dist-packages/ 目录下。你需要执行以下命令: sudo mv site-packages/cx_Oracle* dist-packages/ sudo rmdir site-packages/ sudo ln -s dist-packages site-packages

现在你应该可以顺利连接到 Oracle 数据库了。从 Python 中输入:

import cx_Oracle

要连接到数据库,需要在 tsnames.ora 文件中指定连接字符串,或者直接指定:

connection_string = 'username/password@(DESCRIPTION= (ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521))(CONNECT_DATA= (SID=MY_SID)))'

撰写回答