python cx_Oracle模块的安装和使用详细介绍
Python  /  管理员 发布于 6年前   168
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.基本连接C使用Oracle tns alias
connection =cx_Oracle.connect("tp/tp@ocn_test")#查看tns alias命令cmd>tnsping ocn_testTNS Ping Utility forLinux: Version 9.2.0.8.0-Production on 27-SEP-201110:47:48Copyright (c) 1997, 2006, Oracle Corporation. Allrights reserved.Used parameter files:/opt/……/sqlnet.oraUsed TNSNAMES adapter to resolve the aliasAttempting 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')#orconnection =cx_Oracle.connect('tp/[email protected]: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 SYSOPERconnection =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种连接方式,瞬间解决此问题。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..路人 在
php中使用hyperf框架调用讯飞星火大模型实现国内版chatgpt功能示例中评论 教程很详细,如果加个前端chatgpt对话页面就完美了..Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号