一般情况下,如果要连接Oracle数据库都需要安装Oracle数据库客户端,但是毕竟客户端还是比较笨重的(500多M)。在客户端下一般使用sqlplus连接。好在Oracle官方提供了各种语言的Oracle数据库连接的InstantClient,所以只需要下载对应版本的InstantClient即可,相关下载地址:http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html
考虑到跨平台使用,而我本人有对python比较熟悉,所以打算使用python连接Oracle数据库。关于Linux的Oracle的安装可以参考这里链接:
下面是简单的安装配置过程以及简单的python连接Oracle数据库的操作教程:
一、安装Oracle提供的InstantClient
在Oracle官方网站下载对于版本的Oracle数据库的InstantClient。下载这里需要的三个安装文件:instantclient-basic-linux文件、instantclient-sdk-linux文件和instantclient-sqlplus-linux(注意:为保证不出现错误,建议还是安装上第三个文件sqlplus,我之前没有安装就导致了错误。注意还要对应系统版本)。这里我选的是:instantclient-basic-linux.x64-11.2.0.4.0.zip、instantclient-sdk-linux.x64-11.2.0.4.0.zip和instantclient-sqlplus-linux.x64-11.2.0.4.0.zip 。新建目录(这里我默认放在/opt/oracle/下),解压上面三个文件,它们会解压到当前目录的instantclient_11_2/下。在该目录下新建lib目录,并把当前目录下的所有文件cp(不是目录)到lib下
mkdir -p /opt/oracle && cd /opt/oracle
unzip instantclient-sdk-linux.x64-11.2.0.4.0.zip
unzip ipinstantclient-basic-linux.x64-11.2.0.4.0.zip
unzip instantclient-sqlplus-linux.x64-11.2.0.4.0.zip
cd ./instantclient_11_2/ && mkdir lib && cp ./* ./lib
1
2
3
4
5
6
7
mkdir-p/opt/oracle&&cd/opt/oracle
unzipinstantclient-sdk-linux.x64-11.2.0.4.0.zip
unzipipinstantclient-basic-linux.x64-11.2.0.4.0.zip
unzipinstantclient-sqlplus-linux.x64-11.2.0.4.0.zip
cd./instantclient_11_2/&&mkdirlib&&cp./*./lib
添加Oracle的监听配置文件:listener.ora、sqlnet.ora、tnsnames.ora。在上面的instantclient_11_2/目录下创建目录 /network/admin/,在创建的admin/目录下新建上面上三个文件(实际上这个文件是没有的,需要手动创建):
listener.ora文件:
# listener.ora Network Configuration File: /opt/oracle/instantclient_11_2/network/admin/listener.ora
#
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /opt/oracle/instantclient_11_2) //配置本地客户端路径:$ORACLE_HOME
(PROGRAM = extproc)
)
)
SERVER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) //配置本地HOST,本机IP或主机名、端口
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) //同上
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# listener.ora Network Configuration File: /opt/oracle/instantclient_11_2/network/admin/listener.ora
#
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(SID_NAME=PLSExtProc)
(ORACLE_HOME=/opt/oracle/instantclient_11_2)//配置本地客户端路径:$ORACLE_HOME
(PROGRAM=extproc)
)
)
SERVER=
(DESCRIPTION_LIST=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))//配置本地HOST,本机IP或主机名、端口
)
)
LISTENER=
(DESCRIPTION_LIST=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))//同上
(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC0))
)
)
sqlnet.ora文件:
# This file is actually generated by netca. But if customers choose to
# install "Software Only", this file wont exist and without the native
# authentication, they will not be able to connect to the database on NT.
SQLNET.AUTHENTICATION_SERVICES = (NTS)
1
2
3
4
5
# This file is actually generated by netca. But if customers choose to
# install "Software Only", this file wont exist and without the native
# authentication, they will not be able to connect to the database on NT.
SQLNET.AUTHENTICATION_SERVICES=(NTS)
tnsnames.ora文件:
ORCL = //这里是数据库实例名(大写)
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 222.xx.xx.xx)(PORT = 1521)) //配置Oracle服务器IP和端口
)
(CONNECT_DATA =
(SERVICE_NAME = orcl) //数据库实例名
)
)
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ORCL=//这里是数据库实例名(大写)
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=222.xx.xx.xx)(PORT=1521))//配置Oracle服务器IP和端口
)
(CONNECT_DATA=
(SERVICE_NAME=orcl)//数据库实例名
)
)
EXTPROC_CONNECTION_DATA=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC0))
)
(CONNECT_DATA=
(SID=PLSExtProc)
(PRESENTATION=RO)
)
)
添加环境变量。为使所有用户都能够使用,这里添加到系统的全局环境变量中。在/etc/profile中添加下面三行环境变量:
export ORACLE_HOME=/opt/oracle/instantclient_11_2
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib:/usr/local/lib
export ORACLE_SID=orcl
1
2
3
exportORACLE_HOME=/opt/oracle/instantclient_11_2
exportLD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib:/usr/local/lib
exportORACLE_SID=orcl
更新该文件。至此就可以使用sqlplus做连接测试了,当然服务器端也需要简单的配置下监听程序以配合客户端连接。
source /etc/profile
cd $ORACLE_HOME
./sqlplus system/hehe@orcl //连接测试
1
2
3
source/etc/profile
cd$ORACLE_HOME
./sqlplussystem/hehe@orcl//连接测试
二、安装Python连接Oracle的cx_Oracle包
cx_oracle是一个支持Python连接Oracle数据库的扩展模块,可以访问Oracle数据库和符合Python数据库API规范。在Python官方文档上有关于cx_Oracle更多详细的说明:https://pypi.python.org/pypi/cx_Oracle 在此下载cx_Oracle的python安装源码包(在此说明下,由于大多数linux没有上面第一步安装InstantClient,所以当使用pip install 时会报错的!)。现在就可以源码安装cx_Oracle模块了:
安装一些必要的环境:
apt-get install python-dev build-essential libaio1
1
apt-getinstallpython-devbuild-essentiallibaio1
解压源码并进入其目录:
python setup.py build && python setup.py install
1
pythonsetup.pybuild&&pythonsetup.pyinstall
至此,cx_Oracle的Python扩展模块算是安装完成了。ps:在执行完第一步后其实就可以使用pip install cx_Oracle安装了的。另外,在安装时遇到各种问题,常见的就是下面的问题:
ImportError: libclntsh.so.11.1: cannot open shared object file: No such file or directory
1
ImportError:libclntsh.so.11.1:cannotopensharedobjectfile:Nosuchfileordirectory
结合网上一大堆的解决方案,基本可以确定是由于环境变量的问题,所以还是建议大家安装上面的方法安装,基本不会出现很大问题。
三、Python对Oracle数据库的基本操作
在上面下载的cx_oracle源码包中有很多关于python操作Oracle的样例代码。下面只做简单的操作说明,基本的操作流程如下:
1.引用模块cx_Oracle
2.连接数据库
3.获取cursor
4.使用cursor进行各种操作
5.关闭cursor
6.关闭连接
下面是一个简单的例子:
Python
import cx_Oracle #引用模块cx_Oracle
conn=cx_Oracle.connect('system/hehe@orcl') #连接数据库
c=conn.cursor() #获取cursor
x=c.execute('select * from v$version') #使用cursor进行各种操作
x.fetchone()
c.close() #关闭cursor
conn.close() #关闭连接
1
2
3
4
5
6
7
importcx_Oracle#引用模块cx_Oracle
conn=cx_Oracle.connect('system/hehe@orcl')#连接数据库
c=conn.cursor()#获取cursor
x=c.execute('select * from v$version')#使用cursor进行各种操作
x.fetchone()
c.close()#关闭cursor
conn.close()#关闭连接