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 参数列表中的self 显式不等于冗余
Dec 01 Python
Pandas 数据框增、删、改、查、去重、抽样基本操作方法
Apr 12 Python
Python实现将Excel转换成为image的方法
Oct 23 Python
Windows 安装 Anaconda3+PyCharm的方法步骤
Jun 13 Python
linux环境下Django的安装配置详解
Jul 22 Python
django的模型类管理器——数据库操作的封装详解
Apr 01 Python
python读取配置文件方式(ini、yaml、xml)
Apr 09 Python
使用IPython或Spyder将省略号表示的内容完整输出
Apr 20 Python
PyTorch-GPU加速实例
Jun 23 Python
如何在Win10系统使用Python3连接Hive
Oct 15 Python
Python中的嵌套循环详情
Mar 23 Python
Python测试框架pytest高阶用法全面详解
Jun 01 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中文字符截取防乱码
2008/03/28 PHP
使用PHP Socket 编程模拟Http post和get请求
2014/11/25 PHP
php同时使用session和cookie来保存用户登录信息的实现代码
2016/05/13 PHP
Windows Server 2008 R2和2012中PHP连接MySQL过慢的解决方法
2016/07/02 PHP
javascript中传统事件与现代事件
2015/06/23 Javascript
js实现具有高亮显示效果的多级菜单代码
2015/09/01 Javascript
Node.js编写爬虫的基本思路及抓取百度图片的实例分享
2016/03/12 Javascript
浅析JS中对函数function的理解(基础篇)
2016/10/14 Javascript
jQuery扩展实现text提示还能输入多少字节的方法
2016/11/28 Javascript
javascript阻止事件冒泡和浏览器的默认行为
2017/01/21 Javascript
angular实现页面打印局部功能的思考与方法
2018/04/13 Javascript
nodejs微信开发之自动回复的实现
2019/03/17 NodeJs
vue elementUI使用tabs与导航栏联动
2019/06/21 Javascript
Javascript实现简易天数计算器
2020/05/18 Javascript
深度剖析使用python抓取网页正文的源码
2014/06/11 Python
在Python中使用AOP实现Redis缓存示例
2017/07/11 Python
Python使用 Beanstalkd 做异步任务处理的方法
2018/04/24 Python
wxPython的安装与使用教程
2018/08/31 Python
python实现从文件中读取数据并绘制成 x y 轴图形的方法
2018/10/14 Python
python3.6利用pyinstall打包py为exe的操作实例
2018/10/31 Python
从运行效率与开发效率比较Python和C++
2018/12/14 Python
Python的UTC时间转换讲解
2019/02/26 Python
Python3.5面向对象与继承图文实例详解
2019/04/24 Python
Python连接SQLite数据库并进行增册改查操作方法详解
2020/02/18 Python
python中_del_还原数据的方法
2020/12/09 Python
HTML5的video标签的浏览器兼容性增强方案分享
2016/05/19 HTML / CSS
HTML5之tabindex属性全面解析
2016/07/07 HTML / CSS
Html5应用程序缓存(Cache manifest)
2018/06/04 HTML / CSS
迪奥官网:Dior.com
2018/12/04 全球购物
巴西箱包、背包、钱包和旅行配件购物网站:Inovathi
2019/12/14 全球购物
实习自我鉴定范文
2013/10/30 职场文书
家长给幼儿园的表扬信
2014/01/09 职场文书
医务人员自我评价
2014/01/26 职场文书
公司委托书范本
2014/04/04 职场文书
刘公岛导游词
2015/02/05 职场文书
Mongo服务重启异常问题的处理方法
2021/07/01 MongoDB