最近几天研究python如何连接oracle数据库,在linux下可以完美解决,root下使用源码安装即可(注意把oracle的环境变量加上),但是在windows下安装出现了问题。
python我使用的是python3.4.4,cx_Oracle为5.2.1,结果安装成功后导入时报错:
<span style="font-family:KaiTi_GB2312;font-size:14px;">在python下输入:
import cx_Oracle
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
import cx_Oracle
ImportError: DLL load failed: %1 不是有效的 Win32 应用程序</span>
一开始查资料,说是版本不一致,要么python跟cx_Oracle都是32位,要么都是64位,后来检查了下,发现都是64位的,没有理由再报错啊。
再细看报错 DDL load failed,突然想到python在连接数据库时需要调用oracle客户端的库文件(oci.dll),他们之间的版本也要一致,果不其然。
查询了下oracle客户端的版本,发现是32位的,果断安装64位客户端,然后再次导入ox_Oracle模块,成功,如下:
<span style="font-family:KaiTi_GB2312;font-size:14px;">C:\Users\md>python
Python 3.4.4 (v3.4.4:737efcadf5a6, Dec 20 2015, 20:20:57) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import cx_Oracle
>>></span>
连接成功后可以执行数据库操作了,oh yeah!<span style="font-family:KaiTi_GB2312;font-size:14px;">>>> cx_Oracle.clientversion()
(11, 2, 0, 1, 0)
>>> db=cx_Oracle.connect('system','oracle','192.168.56.10:1521/orcl')
>>> print (db.version)
11.2.0.4.0
>>> cr = db.cursor()
>>> sql = 'select open_mode from v$database'
>>> cr.execute(sql)
<cx_Oracle.Cursor on <cx_Oracle.Connection to system@192.168.56.10:1521/orcl>>
>>> rs=cr.fetchall()
>>> print (rs)
[('READ WRITE',)]
>>></span>
综上,我们使用python通过cx_Oracle模块连接Oracle时,一定要注意保证三者(python,cx_Oracle,Oracle客户端)版本对应,位数一致
补充一下三者位数不一致的影响,近期发现(2017/8/31):
原版本:
Python3.6.1 64bit
cx_Oracle 6.0.1 64bit
oracle客户端 11.2.0.4 32bit
发现在建立到db的连接语句时报错:
db = cx_Oracle.connect(username,passwd,dsn)
UnicodeDecodeError: 'utf-8' codec can't decode bytes in position 95-96: invalid continuation byte
本来以为是字符集nls_lang问题,后来发现其实数据库没有连接时(oracle关闭时也是会报错的)
最后换了oracle客户端为12.2.0.1 bit64位,一切正常