win 环境Python 连接 Oracle 数据正解

记录cx_Oracle 在windows下的安装、连接数据库的踩过的坑,希望能帮助到你。

先后遇到的问题有:
easy_install : Oracle home (D:\instantclient\sdk) does not refer to an 10g, 11g or 12c
ORA-12560: TNS:protocol adapter error
ORA-28547:connection to server failed,probable Oracle Net admin

尝试了各种姿势之后,正解是 予而不语的Windows下安装cx_Oracle记录

其中要点是:

  • 下载二进制包安装 如 cx_Oracle-xx.win-amd64-py2.7.msi,pip 亲测失败。
  • 下载 instantclient-basic-win64-xx.zip,敲黑板,注意一定是要 basic。
  • 关键步骤:将instantclient-basic压缩包内的文件解压出来,其中所有的dll复制至python的~\Lib\site-packages。我为了偷懒下载了 instantclient-basiclite 包,复制dll文件时,看起来一样,也能成功 import cx_Oracle,但是连接数据库时报 ORA-28547 错误,深坑。
  • 连接数据库,可能需要 makesdn 才能正常连接,参考 stackoverflow cx_Oracle doesn't connect when using SID instead of service name on connection string:

import cx_Oracle
dsnStr = cx_Oracle.makedsn("172.xx.xx.xx","1521",sid="db2")
con = cx_Oracle.connect(user="user", password="pwd", dsn=dsnStr)
con.version

  • 至于网上各种瞎扯所谓需要安装sdk,配置 instantclient的环境变量,以及写 tnsnames.ora 文件,都不是必须的。甚至还有人在安装过程中说需要 本地安装 Oracle Database 11g Express Edition,简直是服!

扩展

  • 如何使用 cx_Oracle
  • 查询数据库语言编码 SELECT USERENV ('language') FROM DUAL ;返回诸如 SIMPLIFIED CHINESE_CHINA.ZHS16GBK ,在导入模块之前 设置 os.environ ,就可以正确使用unicode查询了。

import os
os.environ["NLS_LANG"] = "SIMPLIFIED CHINESE_CHINA.ZHS16GBK"
import cx_Oracle

Insert 语句同样不需要特殊处理,如cursor.execute("insert into COMPANY(id, name) values(:1,:2) ",(211,u'额外'))
但是查询出来的结果依然需要手动 decode成unicode对象,如print res_l[2][1].decode('gbk')

你可能感兴趣的:(win 环境Python 连接 Oracle 数据正解)