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实用代码片段收集贴
Jun 03 Python
CentOS中使用virtualenv搭建python3环境
Jun 08 Python
python实现颜色空间转换程序(Tkinter)
Dec 31 Python
Python中第三方库Requests库的高级用法详解
Mar 12 Python
python实现报表自动化详解
Nov 16 Python
Python实现的井字棋(Tic Tac Toe)游戏示例
Jan 31 Python
PHP实现发送和接收JSON请求
Jun 07 Python
selenium在执行phantomjs的API并获取执行结果的方法
Dec 17 Python
python下载微信公众号相关文章
Feb 26 Python
Django如何防止定时任务并发浅析
May 14 Python
如何通过Python3和ssl实现加密通信功能
May 09 Python
详解pandas apply 并行处理的几种方法
Feb 24 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的开合式多级菜单程序
2006/10/09 PHP
php猴子选大王问题解决方法
2015/05/12 PHP
PHP number_format函数原理及实例解析
2020/07/14 PHP
PHP文件操作简单介绍及函数汇总
2020/12/11 PHP
Javascript继承机制的设计思想分享
2011/08/28 Javascript
DOM基础教程之使用DOM + Css
2015/01/20 Javascript
jquery带翻页动画的电子杂志代码分享
2015/08/21 Javascript
第三章之Bootstrap 表格与按钮功能
2016/04/25 Javascript
JS中innerHTML和pasteHTML的区别实例分析
2016/06/22 Javascript
Js利用prototype自定义数组方法示例
2017/10/20 Javascript
vuex提交state&&实时监听state数据的改变方法
2018/09/16 Javascript
vue+echarts实现可拖动节点的折线图(支持拖动方向和上下限的设置)
2019/04/12 Javascript
解决layui table表单提示数据接口请求异常的问题
2019/09/24 Javascript
原生javascript运动函数的封装示例【匀速、抛物线、多属性的运动等】
2020/02/23 Javascript
vue过滤器实现日期格式化的案例分析
2020/07/02 Javascript
Django后台获取前端post上传的文件方法
2018/05/28 Python
python开发入门——set的使用
2020/09/03 Python
Django restful framework生成API文档过程详解
2020/11/12 Python
Pyside2中嵌入Matplotlib的绘图的实现
2021/02/22 Python
AutoShack.com加拿大:北美主要的汽车零部件零售商
2019/07/24 全球购物
德国最大的网上足球商店:11teamsports
2019/09/11 全球购物
英国奢侈品在线精品店:Hervia
2020/09/03 全球购物
《木笛》教学反思
2014/03/01 职场文书
音乐节策划方案
2014/06/09 职场文书
企业标语口号
2014/06/10 职场文书
大学生学习计划书
2014/09/15 职场文书
大学生推广普通话演讲稿
2014/09/21 职场文书
2015入党个人自传范文
2015/06/26 职场文书
2015年新农村建设指导员工作总结
2015/07/24 职场文书
MySQL 查询速度慢的原因
2021/05/25 MySQL
CSS布局之浮动(float)和定位(position)属性的区别
2021/09/25 HTML / CSS
python多线程方法详解
2022/01/18 Python
在Python 中将类对象序列化为JSON
2022/04/06 Python
SQL Server删除表中的重复数据
2022/05/25 SQL Server
 python中的元类metaclass详情
2022/05/30 Python