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使用win32com库播放mp3文件的方法
May 30 Python
python编程培训 python培训靠谱吗
Jan 17 Python
TensorFlow实现创建分类器
Feb 06 Python
Python读取mat文件,并转为csv文件的实例
Jul 04 Python
浅谈pycharm出现卡顿的解决方法
Dec 03 Python
Python实现二维曲线拟合的方法
Dec 29 Python
python如何读取bin文件并下发串口
Jul 05 Python
python实现socket+threading处理多连接的方法
Jul 23 Python
python各类经纬度转换的实例代码
Aug 08 Python
修改Pandas的行或列的名字(重命名)
Dec 18 Python
如何用Anaconda搭建虚拟环境并创建Django项目
Aug 02 Python
python单元测试框架pytest的使用示例
Oct 07 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与MySQL开发的8个技巧小结
2010/12/17 PHP
Yii框架where查询用法实例分析
2019/10/22 PHP
jQuery的Ajax时无响应数据的解决方法
2010/05/25 Javascript
读jQuery之十 事件模块概述
2011/06/27 Javascript
javascript中方便增删改cookie的一个类
2012/10/11 Javascript
jquery仿京东导航/仿淘宝商城左侧分类导航下拉菜单效果
2013/04/24 Javascript
js实现的常用的左侧导航效果
2013/10/17 Javascript
让html页面不缓存js的实现方法
2014/10/31 Javascript
推荐10个2014年最佳的jQuery视频插件
2014/11/12 Javascript
jQuery基础语法实例入门
2014/12/23 Javascript
JavaScript删除数组元素的方法
2015/03/20 Javascript
javascript日期操作详解(脚本之家整理)
2015/09/05 Javascript
jquery实现文本框textarea自适应高度
2016/03/09 Javascript
javascript实现方法调用与方法触发小结
2016/03/26 Javascript
js控制文本框只能输入中文、英文、数字与指定特殊符号的实现代码
2016/09/09 Javascript
快速掌握jquery分页插件jqPaginator的使用方法
2017/08/09 jQuery
基于JavaScript中字符串的match与replace方法(详解)
2017/12/04 Javascript
详解微信小程序与内嵌网页交互实现支付功能
2018/10/22 Javascript
JavaScript简单实现动态改变HTML内容的方法示例
2018/12/25 Javascript
Vue 中可以定义组件模版的几种方式
2019/08/06 Javascript
谈谈IntersectionObserver懒加载的具体使用
2019/10/15 Javascript
Python中的特殊语法:filter、map、reduce、lambda介绍
2015/04/14 Python
win与linux系统中python requests 安装
2016/12/04 Python
Python 多线程Threading初学教程
2017/08/22 Python
在python3中使用shuffle函数要注意的地方
2020/02/28 Python
pygame实现弹球游戏
2020/04/14 Python
Python使用多进程运行含有任意个参数的函数
2020/05/02 Python
Python实现石头剪刀布游戏
2021/01/20 Python
在求职信中如何凸显个人优势
2013/10/30 职场文书
计算机专业毕业生自荐信范文
2014/03/06 职场文书
村支部书记群众路线对照检查材料思想汇报
2014/10/08 职场文书
2014年教师教学工作总结
2014/11/08 职场文书
张思德观后感
2015/06/09 职场文书
Nginx的反向代理实例详解
2021/03/31 Servers
AngularJS实现多级下拉框
2022/03/25 Javascript
Android基于Fresco实现圆角和圆形图片
2022/04/01 Java/Android