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使用nntp读取新闻组内容的方法
May 08 Python
在Django中使用Sitemap的方法讲解
Jul 22 Python
python 2.6.6升级到python 2.7.x版本的方法
Oct 09 Python
python基础_文件操作实现全文或单行替换的方法
Sep 04 Python
TensorFlow安装及jupyter notebook配置方法
Sep 08 Python
Python cookbook(数据结构与算法)将序列分解为单独变量的方法
Feb 13 Python
基于python绘制科赫雪花
Jun 22 Python
对python 中re.sub,replace(),strip()的区别详解
Jul 22 Python
如何使用Python破解ZIP或RAR压缩文件密码
Jan 09 Python
Python networkx包的实现
Feb 14 Python
python 元组的使用方法
Jun 09 Python
python等待10秒执行下一命令的方法
Jul 19 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中GET变量的使用
2006/10/09 PHP
新手学习PHP的一些基础知识分享
2011/07/27 PHP
php统计数组元素个数的方法
2015/07/02 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
2018/05/23 PHP
jQuery 图片切换插件(代码比较少)
2012/05/07 Javascript
Javascript 面向对象(二)封装代码
2012/05/23 Javascript
javascript 文件的同步加载与异步加载实现原理
2012/12/13 Javascript
12种不宜使用的Javascript语法整理
2013/11/04 Javascript
jQuery中innerWidth()方法用法实例
2015/01/19 Javascript
jQuery中toggle()函数的使用实例
2015/04/17 Javascript
js实现类似菜单风格的TAB选项卡效果代码
2015/08/28 Javascript
js获取及判断键盘按键的方法
2015/12/01 Javascript
自定义Angular指令与jQuery实现的Bootstrap风格数据双向绑定的单选与多选下拉框
2015/12/12 Javascript
javascript检查某个元素在数组中的索引值
2016/03/30 Javascript
关于JS变量和作用域详解
2016/07/28 Javascript
JavaScript trim 实现去除字符串首尾指定字符的简单方法
2016/12/27 Javascript
AngularJS对动态增加的DOM实现ng-keyup事件示例
2018/03/12 Javascript
js简单的分页器插件代码实例
2019/09/11 Javascript
Layui表格行工具事件与数据回填方法
2019/09/13 Javascript
js实现倒计时秒杀效果
2020/03/25 Javascript
JavaScript数组常用的增删改查与其他属性详解
2020/10/13 Javascript
python简单实现最大似然估计&scipy库的使用详解
2020/04/15 Python
解决Python Matplotlib绘图数据点位置错乱问题
2020/05/16 Python
浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
2020/06/23 Python
python3中确保枚举值代码分析
2020/12/02 Python
中国电子产品外贸网站:MiniIntheBox
2017/02/06 全球购物
Ajax主要包含了哪些技术
2014/06/12 面试题
工程管理专业毕业生自荐信
2014/01/24 职场文书
浪费资源的建议书
2014/03/12 职场文书
建设工地安全标语
2014/06/07 职场文书
党员学习群众路线教育实践活动对照检查材料
2014/09/23 职场文书
2014年房地产销售工作总结
2014/12/01 职场文书
优秀班组事迹材料
2014/12/24 职场文书
中学生打架《检讨书》范文
2019/08/12 职场文书
Python中super().__init__()测试以及理解
2021/12/06 Python
解决Vmware虚拟机安装centos8报错“Section %Packages Does Not End With %End. Pane Is Dead”
2022/06/01 Servers