设为首页 收藏本站
查看: 1465|回复: 0

[经验分享] python连接oracle配置

[复制链接]

尚未签到

发表于 2018-8-10 12:55:50 | 显示全部楼层 |阅读模式
  环境:
  操作系统:win7 64位,CPU是inter的pc机

  Oracle服务端:Oracle Database 11g Enterprise Edition>  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()

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-549694-1-1.html 上篇帖子: Python基础复习 下篇帖子: python的输入输出
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表