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发送邮件的实例代码(支持html、图片、附件)
Mar 04 Python
python字符串连接的N种方式总结
Sep 17 Python
详解使用python crontab设置linux定时任务
Dec 08 Python
python定时利用QQ邮件发送天气预报的实例
Nov 17 Python
Python中的Numpy矩阵操作
Aug 12 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
Jan 03 Python
Python实现图片裁剪的两种方式(Pillow和OpenCV)
Oct 30 Python
PyTorch实现ResNet50、ResNet101和ResNet152示例
Jan 14 Python
Python函数必须先定义,后调用说明(函数调用函数例外)
Jun 02 Python
浅谈pandas dataframe对除数是零的处理
Jul 20 Python
Selenium结合BeautifulSoup4编写简单的python爬虫
Nov 06 Python
Python使用Turtle模块绘制国旗的方法示例
Feb 28 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-FPM运行状态的实时查看及监控详解
2016/11/18 PHP
php实现session共享的实例方法
2019/09/19 PHP
laravel 自定义常量的两种方案
2019/10/14 PHP
基于jQuery的模仿新浪微博时间的组件
2011/10/04 Javascript
jQuery load方法用法集锦
2011/12/06 Javascript
Javascript实现DIV滚动自动滚动到底部的代码
2012/03/01 Javascript
9款2014最热门jQuery实用特效推荐
2014/12/07 Javascript
node.js中的fs.realpathSync方法使用说明
2014/12/16 Javascript
js实现Select下拉框具有输入功能的方法
2015/02/06 Javascript
JQuery创建DOM节点的方法
2015/06/11 Javascript
非常实用的12个jquery代码片段
2015/11/02 Javascript
Bootstrap基本组件学习笔记之缩略图(13)
2016/12/08 Javascript
通过AngularJS实现图片上传及缩略图展示示例
2017/01/03 Javascript
从零开始做一个pagination分页组件
2017/03/15 Javascript
js获取文件里面的所有文件名(实例)
2017/10/17 Javascript
解决Vue @submit 提交后不刷新页面问题
2020/07/18 Javascript
Python中for循环控制语句用法实例
2015/06/02 Python
python 字典(dict)按键和值排序
2016/06/28 Python
python定向爬虫校园论坛帖子信息
2018/07/23 Python
python中单例常用的几种实现方法总结
2018/10/13 Python
opencv 获取rtsp流媒体视频的实现方法
2019/08/23 Python
pygame实现俄罗斯方块游戏(对战篇1)
2019/10/29 Python
Python 生成一个从0到n个数字的列表4种方法小结
2019/11/28 Python
利用python如何实现猫捉老鼠小游戏
2020/12/04 Python
去除python中的字符串空格的简单方法
2020/12/22 Python
python FTP编程基础入门
2021/02/27 Python
CSS3 三维变形实现立体方块特效源码
2016/12/15 HTML / CSS
日本非常有名的内衣丝袜品牌:GUNZE
2017/01/06 全球购物
吸烟检讨书2000字
2014/02/13 职场文书
农村结婚典礼司仪主持词
2014/03/14 职场文书
优秀学生评语大全
2014/04/25 职场文书
基层领导干部“四风”问题批评与自我批评
2014/09/23 职场文书
优秀员工事迹材料
2014/12/20 职场文书
怀孕辞职信怎么写
2015/02/28 职场文书
解决Python中的modf()函数取小数部分不准确问题
2021/05/28 Python
Python使用pyecharts控件绘制图表
2022/06/05 Python