以下是Python中通过cx_Oracle操作数据库的过程中我所遇到的问题总结,感谢我们测试组的前辈朱勃给予的帮助最终解决了下列两个问题:
1)安装cx_Oracle会遇到的问题:在Windows下安装cx_Oracle不要尝试用pip install的方式了!下载官网的对应版本的msi安装文件,我的python2.7是32位的,oracle的instantClient也是32位的,这个cx_Oracle也选择32位的下载,安装成功后进入python模式下import cx_Oracle没问题,安装成功。
2)使用cx_Oracle会遇到的问题:在通过cx_Oracle访问数据库的过程中,如果出现“InterfaceError: Unable to acquire Oracle environment handle”的错误!把oracle客户端的所有文件拷贝到“D:\Python27\Lib\site-packages”即Python的安装路径根目录下(因为不知道具体要拷贝哪些,就全拷贝了),如下图所示:
以下是通过cx_Oracle远程访问oracle数据库的方式(保存在本地文件夹下的execute_sql.py文件中):
# -*- coding: utf-8 -*- import cx_Oracle def interact_db(userInfo,dbStr,sql): connStr = userInfo + dbStr conn = cx_Oracle.connect(connStr) c = conn.cursor() c.execute(sql) if sql.startswith('select'): fir=c.fetchall() conn.commit() c.close() conn.close() return fir else: conn.commit() c.close() conn.close() def exec_sql(userInfo,dbStr,sql): if sql.startswith('select'): results = interact_db(userInfo,dbStr,sql) return results else: interact_db(userInfo,dbStr,sql)
userInfo这个变量里存的是用户信息,格式为'用户名/密码';
dbStr变量里存的是数据库连接字符串,格式为'@HOST:PORT/SERVICE_NAME'。例子如下:
dbStr = '@20.129.340.851:8885/test' userInfo = 'userName/passWord'
用户名密码后面那些信息(数据库连接字符串)可在本地oracle客户端文件夹下的“TNSNAMES.ORA”文件中查看,如下图位置所示:
之后在其他的脚本中就可以调用这个数据库访问脚本来实现对数据库的操作了。例子如下:
# -*- coding: utf-8 -*- from execute_sql import exec_sql dbStr = '@HOST:PORT/SERVICE_NAME' userInfo = 'username/password' #查询 dbSql = 'select xx from xxx where a like \'%aaa%\'' r = exec_sql(userInfo,dbStr,dbSql) tip = u'XXXXXXX:'+r[0][0]