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


Posted in Python onFebruary 13, 2017

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继承问题
May 29 Python
最大K个数问题的Python版解法总结
Jun 16 Python
疯狂上涨的Python 开发者应从2.x还是3.x着手?
Nov 16 Python
Python3生成手写体数字方法
Jan 30 Python
Python机器学习k-近邻算法(K Nearest Neighbor)实例详解
Jun 25 Python
python 美化输出信息的实例
Oct 15 Python
python计算无向图节点度的实例代码
Nov 22 Python
python线程信号量semaphore使用解析
Nov 30 Python
python的help函数如何使用
Jun 11 Python
浅谈keras 的抽象后端(from keras import backend as K)
Jun 16 Python
PyTorch实现重写/改写Dataset并载入Dataloader
Jul 14 Python
Python爬虫基础之爬虫的分类知识总结
May 13 Python
python数据清洗系列之字符串处理详解
Feb 12 #Python
python中numpy基础学习及进行数组和矢量计算
Feb 12 #Python
python 数据清洗之数据合并、转换、过滤、排序
Feb 12 #Python
python3制作捧腹网段子页爬虫
Feb 12 #Python
python日志记录模块实例及改进
Feb 12 #Python
Windows下Python2与Python3两个版本共存的方法详解
Feb 12 #Python
使用Python绘制图表大全总结
Feb 11 #Python
You might like
操作Oracle的php类
2006/10/09 PHP
zf框架的Filter过滤器使用示例
2014/03/13 PHP
php解决抢购秒杀抽奖等大流量并发入库导致的库存负数的问题
2014/06/19 PHP
PHP+HTML+JavaScript+Css实现简单爬虫开发
2016/03/28 PHP
laravel中的错误与日志用法详解
2016/07/26 PHP
php判断是否为ajax请求的方法
2016/11/29 PHP
thinkphp3.2.0 setInc方法 源码全面解析
2018/01/29 PHP
详解PHP神奇又有用的Trait
2019/03/25 PHP
Js四则运算函数代码
2012/07/21 Javascript
关于JavaScript的面向对象和继承有利新手学习
2013/01/11 Javascript
js判断选择的时间是否大于今天的代码
2013/08/20 Javascript
javascript数组去重方法终极总结
2014/06/05 Javascript
javascript模拟post提交隐藏地址栏的参数
2014/09/03 Javascript
node.js中的http.response.getHeader方法使用说明
2014/12/14 Javascript
javascript中sort() 方法使用详解
2015/08/30 Javascript
Bootstrap Fileinput文件上传组件用法详解
2016/05/10 Javascript
JavaScript DOM节点操作方法总结
2016/08/23 Javascript
JavaScript封装的常用工具类库bee.js用法详解【经典类库】
2018/09/03 Javascript
vue实现移动端图片上传功能
2019/12/23 Javascript
Python实现股市信息下载的方法
2015/06/15 Python
python实现的多线程端口扫描功能示例
2017/01/21 Python
python 网络编程详解及简单实例
2017/04/25 Python
Python随机生成均匀分布在单位圆内的点代码示例
2017/11/13 Python
Python实现字符串的逆序 C++字符串逆序算法
2020/05/28 Python
Python函数的参数常见分类与用法实例详解
2019/03/30 Python
解决Pymongo insert时会自动添加_id的问题
2020/12/05 Python
CSS3教程(10):CSS3 HSL声明设置颜色
2009/04/02 HTML / CSS
iHerb香港:维生素、补充剂和天然保健品
2017/08/01 全球购物
英国女性时尚精品店:THE DRESSING ROOM
2018/05/23 全球购物
教职工代表大会主持词
2014/04/01 职场文书
团代会主持词
2014/04/02 职场文书
运动会入场口号
2014/06/07 职场文书
环保标语口号
2014/06/13 职场文书
2014幼儿园家长工作总结
2014/11/10 职场文书
考试没考好检讨书(精选篇)
2014/11/16 职场文书
浅谈Python列表嵌套字典转化的问题
2021/04/07 Python