python连接oracle配置
环境:
操作系统:win7 64位,CPU是inter的pc机
Oracle服务端:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
Oracle本地客户端:Release 11.2.0.1.0 32bit Production
Python版本:python2.7.5 (安装路径:C:\Python27\)
cx_Oracle版本:cx_Oracle-5.2.1-11g.win-amd64-py2.7.exe
Iinstantclient版本:instantclient-basic-win-x86-64-11.2.0.1.0.zip
在学习python过程中,需要连接oracle数据库,所以要安装cx_Oracle。
安装cx_Oracle-5.2.1-11g.win-amd64-py2.7.exe,import cx_Oracle报错。提示:import cx_Oracle
ImportError: DLL load failed: %1 不是有效的 Win32 应用程序。根据报错提示应该是缺少dll文件,因为我本机oracle客户端是32位的,64位的cx_Oracle程序调用32位的动态库肯定会报错。
根据文章http://blog.csdn.net/huzhenwei/article/details/3946308指点,去oracle网站下载了instance client,地址是:
http://www.oracle.com/technology/software/tech/oci/instantclient/index.html。
我下载了instantclient-basic-win-x86-64-11.2.0.1.0.zip这个版本。
直接解压C:\instantclient_11_2 目录下。
在“环境变量”的“系统变量”中增加:
ORACLE_HOME = C:\instantclient_11_2 (网上说需要,但是测试不加也可以)
TNS_ADMIN = C:\instantclient_11_2 (网上说需要,但是测试不加也可以)
NLS_LANG = SIMPLIFIED CHINESE_CHINA.ZHS16GBK
修改Path变量,在后面添加 C:\instantclient_11_2
然后把解压包中的oci.dll文件放到%python_home%\Lib\site-packages 下,再次import不会报错了。
执行测试python脚本报错,提示cx_Oracle Interface Error: Unable to acquire Oracle enviroment handle。启动PLSQL登陆打开的是刚才的tns,但登陆就报错ORA-1以为是instance client和之前安装的32位oracle client冲突,ORA-12557。感觉是这个64位的instance client与之前装的32位oracle client冲突了。于是把环境变量里的ORACLE_PATH删掉,就可以登陆PLSQL了。但测试语句还是报那个错。折腾了半天,最后死马当活马医吧,尝试着把C:\instantclient_11_2里面的dll文件都拷贝到了python的C:\Python27\Lib\site-packages目录下,又RUN了一下,居然不报错了。 然后逐个删掉,最后发现oraociei11.dll删掉会报错,而其它dll删掉重新Run都不会报错。
不过使用PLSQL登陆还是会报错,只好把环境变量ORACLE_HOME删掉了,并不影响cx_Oracle的使用。原理不太清楚,先记录下来。
Python测试脚本:
#!/usr/bin/python
#coding=utf-8
import cx_Oracle
username = "smb"
passwd = "czty_smb"
host = "192.168.150.233"
port = "1521"
sid = "zsms"
dsn = cx_Oracle.makedsn(host, port, sid)
con = cx_Oracle.connect(username, passwd, dsn)
cursor= con.cursor()
sql = 'SELECT smbms, prtms FROM t_user_mobile_dz'
cursor.execute(sql)
result = cursor.fetchall()
print "Total: " + str(cursor.rowcount)
for row in result:
print row
cursor.close()
con.close()
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341