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实现的防DDoS脚本
Feb 08 Python
学习python处理python编码问题
Mar 13 Python
Python3.5装饰器典型案例分析
Apr 30 Python
python2和python3实现在图片上加汉字的方法
Aug 22 Python
django中使用事务及接入支付宝支付功能
Sep 15 Python
详解python路径拼接os.path.join()函数的用法
Oct 09 Python
在主流系统之上安装Pygame的方法
May 20 Python
Python实现读取并写入Excel文件过程解析
May 27 Python
Python多线程threading创建及使用方法解析
Jun 17 Python
Win10环境中如何实现python2和python3并存
Jul 20 Python
浅析关于Keras的安装(pycharm)和初步理解
Oct 23 Python
Python中过滤字符串列表的方法
Dec 22 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循环函数使用介绍之PHP基础入门教程
2013/09/21 PHP
ajax+php控制所有后台函数调用
2015/07/15 PHP
PHP实现路由映射到指定控制器
2016/08/13 PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
2016/09/11 PHP
Yii 2中的load()和save()示例详解
2017/08/03 PHP
用Javascript 和 CSS 实现脚注(Footnote)效果
2009/09/09 Javascript
Ext GridPanel加载完数据后进行操作示例代码
2014/06/17 Javascript
JavaScript Function函数类型介绍
2015/04/08 Javascript
深入浅析JavaScript中对事件的三种监听方式
2015/09/29 Javascript
javascript中的3种继承实现方法
2016/01/27 Javascript
Bootstrap自动适应PC、平板、手机的Bootstrap栅格系统
2016/05/27 Javascript
jQuery获取attr()与prop()属性值的方法及区别介绍
2016/07/06 Javascript
JS自定义滚动条效果简单实现代码
2020/10/27 Javascript
Bootstrap滚动监听组件scrollspy.js使用方法详解
2017/07/20 Javascript
Three.js中网格对象MESH的属性与方法详解
2017/09/27 Javascript
对mac下nodejs 更新到最新版本的最新方法(推荐)
2018/05/17 NodeJs
微信小程序倒计时功能实例代码
2018/07/17 Javascript
bootstrap 路径导航 分页 进度条的实例代码
2018/08/06 Javascript
如何为vuex实现带参数的 getter和state.commit
2019/01/04 Javascript
微信小程序自定义纯净模态框(弹出框)的实例代码
2020/03/09 Javascript
详解在IDEA中将Echarts引入web两种方式(使用js文件和maven的依赖导入)
2020/07/11 Javascript
Python常见异常分类与处理方法
2017/06/04 Python
Python 多进程和数据传递的理解
2017/10/09 Python
Python算法输出1-9数组形成的结果为100的所有运算式
2017/11/03 Python
python实现简易通讯录修改版
2018/03/13 Python
Python实现的线性回归算法示例【附csv文件下载】
2018/12/29 Python
python matplotlib饼状图参数及用法解析
2019/11/04 Python
Python pickle模块实现对象序列化
2019/11/22 Python
浅谈Pycharm最有必要改的几个默认设置项
2020/02/14 Python
希尔顿酒店官方网站:Hilton Hotels
2017/06/01 全球购物
L’Artisan Parfumeur官网:法国香水品牌
2020/08/11 全球购物
培训自我鉴定
2014/01/31 职场文书
聘任书的写作格式及范文
2014/03/29 职场文书
主题团日活动总结
2014/06/25 职场文书
解决golang post文件时Content-Type出现的问题
2021/05/02 Golang
python迷宫问题深度优先遍历实例
2021/06/20 Python