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连接mysql并提交mysql事务示例
Mar 05 Python
使用Python编写类UNIX系统的命令行工具的教程
Apr 15 Python
用Python登录Gmail并发送Gmail邮件的教程
Apr 17 Python
python实现文件快照加密保护的方法
Jun 30 Python
Python3 XML 获取雅虎天气的实现方法
Feb 01 Python
python 实现简单的FTP程序
Dec 27 Python
Python实现括号匹配方法详解
Feb 10 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
May 22 Python
python中get和post有什么区别
Jun 19 Python
Python用来做Web开发的优势有哪些
Aug 05 Python
python各种excel写入方式的速度对比
Nov 10 Python
python爬取youtube视频的示例代码
Mar 03 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实现图象锐化代码
2007/06/14 PHP
PHP var_dump遍历对象属性的函数与应用代码
2010/06/04 PHP
PHP实现扎金花游戏之大小比赛的方法
2015/03/10 PHP
详解PHP错误日志的获取方法
2015/07/20 PHP
weiphp微信公众平台授权设置
2016/01/04 PHP
php+mongodb判断坐标是否在指定多边形区域内的实例
2016/10/28 PHP
ThinkPHP5.0框架控制器继承基类和自定义类示例
2018/05/25 PHP
Jquery 获取表单text,areatext,radio,checkbox,select值的代码
2009/11/12 Javascript
深入理解javascript中return的作用
2013/12/30 Javascript
jquery获取当前点击对象的value方法
2014/02/28 Javascript
node.js中的querystring.unescape方法使用说明
2014/12/10 Javascript
windows8.1+iis8.5下安装node.js开发环境
2014/12/12 Javascript
JavaScript插件化开发教程 (二)
2015/01/27 Javascript
javascript实现手机震动API代码
2015/08/05 Javascript
JavaScript setTimeout使用闭包功能实现定时打印数值
2015/12/18 Javascript
JS获取鼠标坐标位置实例分析
2016/01/20 Javascript
AngularJS入门教程之过滤器详解
2016/08/19 Javascript
Angular整合zTree的示例代码
2018/01/24 Javascript
Bootstrap popover 实现鼠标移入移除显示隐藏功能方法
2018/01/24 Javascript
vue项目中使用百度地图的方法
2018/06/08 Javascript
微信小程序实现音乐播放器
2019/11/20 Javascript
详解ES6 扩展运算符的使用与注意事项
2020/11/12 Javascript
Django使用httpresponse返回用户头像实例代码
2018/01/26 Python
TensorFlow 模型载入方法汇总(小结)
2018/06/19 Python
numpy 对矩阵中Nan的处理:采用平均值的方法
2018/10/30 Python
Python minidom模块用法示例【DOM写入和解析XML】
2019/03/25 Python
tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式
2020/01/24 Python
解决Python3.7.0 SSL低版本导致Pip无法使用问题
2020/09/03 Python
Django配置Bootstrap, js实现过程详解
2020/10/13 Python
美国迪克体育用品商店:DICK’S Sporting Goods
2018/07/24 全球购物
活动倡议书范文
2014/05/13 职场文书
三好学生个人先进事迹材料
2014/05/17 职场文书
2015年仓库工作总结
2015/04/09 职场文书
win10安装配置nginx的过程
2021/03/31 Servers
浅谈react useEffect闭包的坑
2021/06/08 Javascript
CSS中Single Div 绘图技巧的实现
2021/06/18 HTML / CSS