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文件写入实例分析
Apr 08 Python
将Django使用的数据库从MySQL迁移到PostgreSQL的教程
Apr 11 Python
python3操作mysql数据库的方法
Jun 23 Python
利用python求相邻数的方法示例
Aug 18 Python
python监控键盘输入实例代码
Feb 09 Python
Python机器学习之K-Means聚类实现详解
Feb 22 Python
python xlsxwriter创建excel图表的方法
Jun 11 Python
pygame游戏之旅 python和pygame安装教程
Nov 20 Python
python读取txt文件中特定位置字符的方法
Dec 24 Python
说说如何遍历Python列表的方法示例
Feb 11 Python
python实现两个dict合并与计算操作示例
Jul 01 Python
详解pandas.DataFrame.plot() 画图函数
Jun 14 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
利用“多说”制作留言板、评论系统
2015/07/14 PHP
php获取目录中所有文件名及判断文件与目录的简单方法
2017/03/04 PHP
imagettftext() 失效,不起作用
2021/03/09 PHP
找到了一篇jQuery与Prototype并存的冲突的解决方法
2007/08/29 Javascript
js sort 二维数组排序的用法小结
2014/01/24 Javascript
node.js中的fs.ftruncate方法使用说明
2014/12/15 Javascript
javascript中函数作为参数调用的方法
2015/02/09 Javascript
javascript实现控制文字大中小显示
2015/04/28 Javascript
JavaScript实现窗口抖动效果
2016/10/19 Javascript
jquery实现input框获取焦点的方法
2017/02/06 Javascript
带你了解session和cookie作用原理区别和用法
2017/08/14 Javascript
JS倒计时实例_天时分秒
2017/08/22 Javascript
Vue精简版风格指南(推荐)
2018/01/30 Javascript
基于Vue中点击组件外关闭组件的实现方法
2018/03/06 Javascript
详解javascript中的babel到底是什么
2018/06/21 Javascript
如何在 JavaScript 中更好地利用数组
2018/09/27 Javascript
JavaScript实现动态添加、移除元素或属性的方法分析
2019/01/03 Javascript
Vue+tracking.js 实现前端人脸检测功能
2020/04/16 Javascript
Nuxt.js的路由跳转操作(页面跳转nuxt-link)
2020/11/06 Javascript
对python中的xlsxwriter库简单分析
2018/05/04 Python
python-itchat 获取微信群用户信息的实例
2019/02/21 Python
pandas 对日期类型数据的处理方法详解
2019/08/08 Python
django写用户登录判定并跳转制定页面的实例
2019/08/21 Python
应用OpenCV和Python进行SIFT算法的实现详解
2019/08/21 Python
python设置环境变量的作用整理
2020/02/17 Python
PyQt5 文本输入框自动补全QLineEdit的实现示例
2020/05/13 Python
Python中的流程控制详解
2021/02/18 Python
利用Python如何画一颗心、小人发射爱心
2021/02/21 Python
浅谈CSS3动画的回调处理
2016/07/21 HTML / CSS
Lookfantastic香港官网:英国知名美妆购物网站
2018/06/19 全球购物
Madewell澳大利亚官方网站:美国休闲服饰品牌
2019/07/18 全球购物
澳洲本土太阳镜品牌:Quay Australia
2019/07/29 全球购物
Penhaligon’s英国官网:成立于1870年的英国香水制造商
2021/02/18 全球购物
main 主函数执行完毕后,是否可能会再执行一段代码,给出说明
2012/12/05 面试题
Redis如何使用乐观锁(CAS)保证数据一致性
2022/03/25 Redis
从零开始在Centos7上部署SpringBoot项目
2022/04/07 Servers