python cx_Oracle模块的安装和使用详细介绍

yipeiwu_com7年前Python基础

python cx_Oracle模块的安装

最近需要写一个数据迁移脚本,将单一Oracle中的数据迁移到MySQL Sharding集群,在linux下安装cx_Oracle感觉还是有一点麻烦的,整理一下,做个总结。

对于Oracle客户端,不只需要安装相应的python模块(这里我用了Oracle官方的python模块——cx_Oracle),还需要安装Oracle Client,一般选择Instant Client就足够了,还需要配置tnsnames.ora(当然也可以简单的通过host:port/schema访问)。

安装:

1. 首先确定版本。因为我们的Oracle数据是在是有点老,所以我选择了一个比较老的版本——Oracle Instant Client 10.2.0.4。

2. 下载instantclient-basic。下载地址:http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html。这里要严重BS Oracle,居然要先注册才能下载,这也算了,关键是注册的时候,密码居然要求有数字有字母,字母还要有大小写,还必须至少8位。逼迫我搞了一个比我银行密码还要安全的密码(好吧,现在我已经忘记我填了什么了...),下basic就可以了。

$wget http://download.oracle.com/otn/linux/instantclient/10204/basic-10.2.0.4.0-linux-x86_64.zip


3.安装配置

$unzip instantclient-basic-linux.x64-10.2.0.4.0.zip
$cd instantclient_10_2
$cp * /usr/lib  #直接放到动态库搜索路径中,不需要额外的环境配置

或
$unzip instantclient-basic-linux.x64-10.2.0.4.0.zip
$cp -rf instantclient_10_2 /opt/
$vi /etc/profile
   export ORACLE_HOME=/opt/instantclient_10_2
   export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME

$source /etc/profile

4.配置tnsnames.ora(可不用配置tns)

注意tnsnames.ora其实并不存在,是要自己创建的(这个也很恶心,我一开始以为还要安装什么东东。。),我没有使用这种方式,有兴趣的可以google一下。

 5.下载安装cx_Oracle python模块

$wget http://downloads.sourceforge.net/project/cx-oracle/5.1.2/cx_Oracle-5.1.2-10g-py26-1.x86_64.rpm
$rpm -ivh cx_Oracle-5.1.2-10g-py26-1.x86_64.rpm 
$ls /usr/lib/python2.6/site-packages/cx_Oracle.so #有这个文件表示安装成功,根据python的位置,也可能在其他地方,自己找一下吧

6.验证及问题解决

$python
>>import cx_Oracle

若报错:import cx_Oracle gave ImportError: libclntsh.so.10.1: cannot open shared object file: No such file or directory

表示没有找到instant client的动态库,check一下环境变量是否配置,是否生效,版本是否正确。

若报错:ImportError: ./cx_Oracle.so: undefined symbol: PyUnicodeUCS4_Decode

Google的信息:There is nothing wrong with Debian. Python supports two incompatible 
 modes of operation for Unicode, UCS2 (the default), and UCS4. Debian uses the default,
 Redhat uses UCS4. You need to recompile the extension for UCS-2 mode
 (i.e. using a Debian installation); this would fix the undefined symbol: PyUnicodeUCS4_Decode

所以重新编译python

$./configure --prefix=/usr/local/python2.6.5 --enable-shared -enable-unicode=ucs4
$make;make install

再次验证,终于正常import了。

使用:

1.基本连接–使用Oracle tns alias

connection =cx_Oracle.connect("tp/tp@ocn_test")
#查看tns alias命令
cmd>tnsping ocn_test
TNS Ping Utility forLinux: Version 9.2.0.8.0-Production on 27-SEP-201110:47:48
Copyright (c) 1997, 2006, Oracle Corporation. Allrights reserved.
Used parameter files:
/opt/……/sqlnet.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL =TCP)(HOST =10.20.36.19)(PORT =1520))) (CONNECT_DATA =(SID =ocntest)))
OK (10msec)

2.用户输入密码连接

pwd =getpass.getpass()
connection =cx_Oracle.connect("tp",pwd,"ocn_test")

3.用户直接在Python命令中输入连接账号信息,格式如python script.py tp/tp@ocn_test

connection =cx_Oracle.connect(sys.argv[1])

4.使用Easy Connect语法,通过Drive连接数据库

connection =cx_Oracle.connect('tp','tp','10.20.36.19:1521/ocntest')
#or
connection =cx_Oracle.connect('tp/tp@10.20.36.19:1521/ocntest')

5.先使用DSN构成TNSNAME

tns_name =cx_Oracle.makedsn('10.20.36.19','1521',' ocntest ')
connection =cx_Oracle.connect('tp','tp',tns_name)

6.登陆as SYSDBA

connection =cx_Oracle.connect('tp/tp@ocn_test', mode=cx_Oracle.SYSDBA)
#or as SYSOPER
connection =cx_Oracle.connect('tp/tp@ocn_test', mode=cx_Oracle.SYSOPER)

在Linux服务器执行Oracle操作时报了一个错误:

TNS:listener does not currently know of service requested in connect descriptor

解决方式:

问题分析见http://ora-12514.ora-code.com/,一番折腾,最后使用第5种连接方式,瞬间解决此问题。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

Python对象的深拷贝和浅拷贝详解

本文内容是在《Python核心编程2》上看到的,感觉很有用便写出来,给大家参考参考! 浅拷贝 首先我们使用两种方式来拷贝对象,一种是切片,另外一种是工厂方法。然后使用id函数来看看它们的...

详尽讲述用Python的Django框架测试驱动开发的教程

详尽讲述用Python的Django框架测试驱动开发的教程

测试驱动开发(TDD)是一个迭代的开发周期,强调编写实际代码之前编写自动化测试。 这个过程很简单:     先编写测试。   ...

探究python中open函数的使用

探究python中open函数的使用

最近,开始学习python的开发,遇到了一点文件操作的问题,探究一下open函数的使用。 一、open()的函数原型 open(file, mode=‘r', buffering=-1,...

九步学会Python装饰器

本文实例讲述了Python装饰器。分享给大家供大家参考。具体分析如下: 这是在Python学习小组上介绍的内容,现学现卖、多练习是好的学习方式。 第一步:最简单的函数,准备附加额外功能...

pygame实现俄罗斯方块游戏(基础篇1)

pygame实现俄罗斯方块游戏(基础篇1)

本文实例为大家分享了pygame实现俄罗斯方块游戏的具体代码,基础的第一篇,供大家参考,具体内容如下 一、初始界面 之前的游戏都比较简单,所以代码都是面向过程的写法,这次游戏后面可能会写...