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笔记(叁)继续学习
Oct 24 Python
Python利用前序和中序遍历结果重建二叉树的方法
Apr 27 Python
简单谈谈python的反射机制
Jun 28 Python
django实现同一个ip十分钟内只能注册一次的实例
Nov 03 Python
Python中str.join()简单用法示例
Mar 20 Python
Python调用adb命令实现对多台设备同时进行reboot的方法
Oct 15 Python
python3实现点餐系统
Jan 24 Python
Python使用type关键字创建类步骤详解
Jul 23 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
Sep 18 Python
浅析python内置模块collections
Nov 15 Python
Python基于正则表达式实现计算器功能
Jul 13 Python
PyCharm2020最新激活码+激活码补丁(亲测最新版PyCharm2020.2激活成功)
Nov 25 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中MD5函数使用实例代码
2008/06/07 PHP
php读取xml实例代码
2010/01/28 PHP
PHP cookie,session的使用与用户自动登录功能实现方法分析
2019/06/05 PHP
JavaScript创建命名空间(namespace)的最简实现
2007/12/11 Javascript
用cssText批量修改样式
2009/08/29 Javascript
JS判断数组中是否有重复值得三种实用方法
2013/08/16 Javascript
jQuery使用之标记元素属性用法实例
2015/01/19 Javascript
JavaScript数据类型检测代码分享
2015/01/26 Javascript
纯JS实现本地图片预览的方法
2015/07/31 Javascript
js中unicode转码方法详解
2015/10/09 Javascript
15个非常实用的JavaScript代码片段
2016/12/18 Javascript
JavaScript 巧学巧用
2017/05/23 Javascript
js 中rewrap-ajax.js插件实例代码
2017/10/20 Javascript
Angular2.0实现modal对话框的方法示例
2018/02/18 Javascript
解决vue中修改export default中脚本报一大堆错的问题
2018/08/27 Javascript
JavaScript循环遍历你会用哪些之小结篇
2018/09/28 Javascript
详解vue中移动端自适应方案
2019/05/05 Javascript
uni app仿微信顶部导航条功能
2019/09/17 Javascript
js实现中文实时时钟
2020/01/15 Javascript
我所理解的JavaScript中的this指向
2020/09/04 Javascript
[53:36]Liquid vs VP Supermajor决赛 BO 第三场 6.10
2018/07/05 DOTA
python 与GO中操作slice,list的方式实例代码
2017/03/20 Python
解决python 输出是省略号的问题
2018/04/19 Python
Python文件循环写入行时防止覆盖的解决方法
2018/11/09 Python
Django用户认证系统 User对象解析
2019/08/02 Python
深入学习python多线程与GIL
2019/08/26 Python
Python hmac模块使用实例解析
2019/12/24 Python
tensorflow使用指定gpu的方法
2020/02/04 Python
利用Python实现某OA系统的自动定位功能
2020/05/27 Python
python使用smtplib模块发送邮件
2020/12/17 Python
高中生学习生活的自我评价
2013/10/09 职场文书
社区爱国卫生月活动总结
2014/06/30 职场文书
乒乓球比赛通知
2015/04/27 职场文书
2015学校年度工作总结
2015/05/11 职场文书
如何制定销售人员薪酬制度?
2019/07/09 职场文书
pytorch 实现变分自动编码器的操作
2021/05/24 Python