作为一个技术人员,不学习一门编程语言,人生是不完整的。
是Shell是Perl还是Python,哪个简单哪个好用,哪个更适合Oracle DBA,这不是本文的范围,俗话说,萝卜青菜,各有所爱。
Mac OS X中自带Python(实际上也自带Shell和Perl),在Lion之后,由于64bit Oracle客户端无法在Mac中正常运行,导致一系列的麻烦。在Python中连接Oracle数据库,通常是使用cx_Oracle扩展模块。如果是Windows或者CentOS/Redhat/OEL Linux可以直接在cx-oracle.sourceforge.net下载相应的安装文件,但是对于Mac而言,却必须下载源码,自行编译。需要解决64bit问题和Oracle Instant Client配置问题。
文本大部分内容参考Andy Chan的Tutorial: How to Install Python Oracle Module “cx_Oracle” on Mac OS X Lion。
在作一切操作之前,请先确认已经安装了XCode,并且安装了Command Line Tools,否则会在最后编译安装cx_Oracle的时候报错:unable to execute llvm-gcc-4.2: No such file or directory
1. 安装Oracle Instant Client,由于众所周知的64bit客户端在Mac OS X Lion中回发生“Segmentation fault: 11”的错误,因此必须下载32bit版本。
编译cx_Oracle需要下载如下图的两个安装文件,不过实际上我是除了Basic Lite之外都下载安装了。具体安装步骤及其它设置可以参看之前我的文章:How to use Oracle Instant Client in Mac OS X Lion。
2. Oracle Instant Client的安装实际上就是解压,然后将生成的目录放在$PATH环境变量中,我将解压后的目录放在:/Applications/Utilities/instantclient,目录中的内容如下:
bogon:instantclient Kamus$ ls -l
total 204152
-rw-r--r--@ 1 Kamus staff 278 Apr 1 2009 BASIC_README
-rw-r--r--@ 1 Kamus staff 276 Apr 1 2009 JDBC_README
-rw-r--r--@ 1 Kamus staff 282 Apr 1 2009 SQLPLUS_README
drwxr-xr-x 3 Kamus admin 102 Aug 9 2011 bin
-rw-r--r--@ 1 Kamus staff 1609607 Feb 2 2008 classes12.jar
-rwxr-xr-x@ 1 Kamus staff 30556 Apr 1 2009 genezi
-rwxr-xr-x@ 1 Kamus staff 1555 Aug 9 2011 glogin.sql
drwxr-xr-x 13 Kamus admin 442 Jul 22 01:38 lib
lrwxr-xr-x 1 Kamus admin 20 Jul 22 01:38 libclntsh.dylib -> libclntsh.dylib.10.1
-rwxr-xr-x@ 1 Kamus staff 21537536 Mar 31 2009 libclntsh.dylib.10.1
-rwxr-xr-x@ 1 Kamus staff 31788 Mar 25 2009 libheteroxa10.dylib
-rwxr-xr-x@ 1 Kamus staff 31788 Mar 25 2009 libheteroxa10.jnilib
-rwxr-xr-x@ 1 Kamus staff 1683924 Feb 11 2009 libnnz10.dylib
-rwxr-xr-x@ 1 Kamus staff 1142284 Feb 11 2009 libocci.dylib.10.1
-rwxr-xr-x@ 1 Kamus staff 72626824 Apr 1 2009 libociei.dylib
-rwxr-xr-x@ 1 Kamus staff 106184 Mar 25 2009 libocijdbc10.dylib
-rwxr-xr-x@ 1 Kamus staff 106184 Mar 25 2009 libocijdbc10.jnilib
-rwxr-xr-x@ 1 Kamus staff 933744 Mar 25 2009 libsqlplus.dylib
-rwxr-xr-x@ 1 Kamus staff 1442316 Feb 11 2009 libsqlplusic.dylib
drwxr-xr-x 3 Kamus admin 102 Jul 30 2011 network
-rw-r--r--@ 1 Kamus staff 1555682 Feb 2 2008 ojdbc14.jar
-rw-r--r--@ 1 Kamus staff 1646178 Jan 23 2008 orai18n.jar
drwxr-xr-x@ 7 Kamus admin 238 Apr 1 2009 sdk
drwxr-xr-x 3 Kamus admin 102 Aug 9 2011 sqlplus
其中需要注意的是:
1) libclntsh.dylib是需要手工创建的链接。
ln -s libclntsh.dylib.10.1 libclntsh.dylib
2) lib目录,在默认解压以后,没有该目录,需要手工创建,然后将所有lib*复制到该目录中。否则在安装cx_Oracle的时候会报错:无法找到正确的ORACLE_HOME。我的lib目录中文件列表如下:
bogon:instantclient Kamus$ ls -l lib
total 194656
lrwxr-xr-x 1 Kamus admin 20 Jul 22 01:38 libclntsh.dylib -> libclntsh.dylib.10.1
-rwxr-xr-x@ 1 Kamus admin 21537536 Jul 22 01:36 libclntsh.dylib.10.1
-rwxr-xr-x@ 1 Kamus admin 31788 Jul 22 01:36 libheteroxa10.dylib
-rwxr-xr-x@ 1 Kamus admin 31788 Jul 22 01:36 libheteroxa10.jnilib
-rwxr-xr-x@ 1 Kamus admin 1683924 Jul 22 01:36 libnnz10.dylib
-rwxr-xr-x@ 1 Kamus admin 1142284 Jul 22 01:36 libocci.dylib.10.1
-rwxr-xr-x@ 1 Kamus admin 72626824 Jul 22 01:36 libociei.dylib
-rwxr-xr-x@ 1 Kamus admin 106184 Jul 22 01:36 libocijdbc10.dylib
-rwxr-xr-x@ 1 Kamus admin 106184 Jul 22 01:36 libocijdbc10.jnilib
-rwxr-xr-x@ 1 Kamus admin 933744 Jul 22 01:36 libsqlplus.dylib
-rwxr-xr-x@ 1 Kamus admin 1442316 Jul 22 01:36 libsqlplusic.dylib
3. 修改环境变量,将以下行添加到~/.bash_profile文件中。
export ORACLE_HOME=/Applications/Utilities/instantclient
export LD_LIBRARY_PATH=ORACLE_HOME
export DYLD_LIBRARY_PATH=ORACLE_HOME
export SQLPATH=ORACLE_HOME
export PATH=PATH:$ORACLE_HOME/bin
#for cx_Oracle,这是必须的,强制Python使用32位版本
export VERSIONER_PYTHON_PREFER_32_BIT=yes
4. 启动新的Terminal窗口,先安装pip,pip是Python的包管理软件,使用pip可以方便地从网络上直接安装需要的Python模块。
sudo easy_install pip
5. 安装cx_Oracle
sudo pip install cx_Oracle
安装过程中产生的类似如下这些警告,可以忽略:
/Applications/Utilities/instantclient/sdk/include/nzt.h:2746: warning: function declaration isn’t a prototype
......
Connection.c:283: warning: implicit conversion shortens 64-bit value into a 32-bit value
......
最终显示如下信息表示安装成功:
Successfully installed cx-Oracle
6. 最后测试一下cx_Oracle是否工作正常。具体语法参看:cx_Oracle 5.1.2 documentation。
bogon:~ Kamuspython
Python 2.7.1 (r271:86832, Aug 5 2011, 03:30:24)
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from cx_Oracle import connect
>>> conn=connect('kamus/oracle@www.enmotech.com:1521/orcl')
>>> curs = conn.cursor()
>>> curs.execute("select * from vversion")
<__builtin__.OracleCursor on >
>>> rows = curs.fetchall()
##以下报错是Python语法对于强制代码缩进的体现,如果for循环中的语句开头没有缩进,则会报错。
>>> for i in range(len(rows)):
... print rows[i][0]
File "", line 2
print rows[i][0]
^
IndentationError: expected an indented block
##在print前增加两个空格即可
>>> for i in range(len(rows)):
... print rows[i][0]
...
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE 11.2.0.3.0 Production
TNS for Solaris: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production
作为一个技术人员,不学习一门编程语言,人生是不完整的。
很赞同这句话。python是一门很不错的语言!!
Oracle已经大规模使用python进行开发部署了,从今年发布的版本都可以看到。python推荐用4个空格做缩进。
官网也有篇很好的入门文章:http://www.oracle.com/technetwork/articles/dsl/python-091105.html