记录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:
<pre>
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
</pre>
- 至于网上各种瞎扯所谓需要安装sdk,配置 instantclient的环境变量,以及写 tnsnames.ora 文件,都不是必须的。甚至还有人在安装过程中说需要 本地安装 Oracle Database 11g Express Edition,简直是服!
扩展
- 如何使用 cx_Oracle
- 查询数据库语言编码 SELECT USERENV ('language') FROM DUAL ;返回诸如 SIMPLIFIED CHINESE_CHINA.ZHS16GBK ,在导入模块之前 设置
os.environ
,就可以正确使用unicode查询了。
<pre>
import os
os.environ["NLS_LANG"] = "SIMPLIFIED CHINESE_CHINA.ZHS16GBK"
import cx_Oracle
</pre>
Insert 语句同样不需要特殊处理,如cursor.execute("insert into COMPANY(id, name) values(:1,:2) ",(211,u'额外'))
但是查询出来的结果依然需要手动 decode成unicode对象,如print res_l[2][1].decode('gbk')