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编程中的运用实例
Jun 26 Python
Python之读取TXT文件的方法小结
Apr 27 Python
在python里从协程返回一个值的示例
Feb 19 Python
django的auth认证,authenticate和装饰器功能详解
Jul 25 Python
pytorch 自定义数据集加载方法
Aug 18 Python
python使用if语句实现一个猜拳游戏详解
Aug 27 Python
从0到1使用python开发一个半自动答题小程序的实现
May 12 Python
Python使用正则表达式实现爬虫数据抽取
Aug 17 Python
Python自动化测试中yaml文件读取操作
Aug 20 Python
Python Opencv轮廓常用操作代码实例解析
Sep 01 Python
python批量修改文件名的示例
Sep 27 Python
python实现MD5进行文件去重的示例代码
Jul 09 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
无需重新编译php加入ftp扩展的解决方法
2013/02/07 PHP
PHP中redis的用法深入解析
2014/02/20 PHP
php命名空间设计思想、用法与缺点分析
2019/07/17 PHP
JavaScript面象对象设计
2008/04/28 Javascript
jQuery live
2009/05/15 Javascript
两个listbox实现选项的添加删除和搜索
2013/03/01 Javascript
Javascript的时间戳和php的时间戳转换注意事项
2013/04/12 Javascript
用JavaScript实现使用鼠标画线的示例代码
2014/08/19 Javascript
c#程序员对TypeScript的认识过程
2015/06/19 Javascript
全面接触神奇的Bootstrap导航条实战篇
2016/08/01 Javascript
jQuery视差滚动效果网页实现方法经验总结
2016/09/29 Javascript
手写Node静态资源服务器的实现方法
2018/03/20 Javascript
json数据格式常见操作示例
2019/06/13 Javascript
python命令行参数解析OptionParser类用法实例
2014/10/09 Python
在Python的Django框架中simple-todo工具的简单使用
2015/05/30 Python
浅谈Python 中整型对象的存储问题
2016/05/16 Python
Python中getattr函数和hasattr函数作用详解
2016/06/14 Python
python实现单线程多任务非阻塞TCP服务端
2017/06/13 Python
Django中的Signal代码详解
2018/02/05 Python
Pytorch入门之mnist分类实例
2018/04/14 Python
对python文件读写的缓冲行为详解
2019/02/13 Python
Python 给定的经纬度标注在地图上的实现方法
2019/07/05 Python
Django之提交表单与前后端交互的方法
2019/07/19 Python
python MultipartEncoder传输zip文件实例
2020/04/07 Python
使用Python内置模块与函数进行不同进制的数的转换
2020/04/26 Python
Python建造者模式案例运行原理解析
2020/06/29 Python
用python实现前向分词最大匹配算法的示例代码
2020/08/06 Python
合作意向书模板
2014/03/31 职场文书
祖国在我心中演讲稿(小学生)
2014/09/23 职场文书
思想政治表现评语
2015/01/04 职场文书
会计岗位职责
2015/02/03 职场文书
软件项目经理岗位职责
2015/04/01 职场文书
毕业论文答辩开场白和答辩技巧
2015/05/27 职场文书
总结会主持词
2015/07/02 职场文书
python实现web邮箱扫描的示例(附源码)
2021/03/30 Python
Python使用pyecharts控件绘制图表
2022/06/05 Python