新手区 Python 连接 oracle 数据库总结

JasonChang · 2017年08月28日 · 最后由 JasonChang 回复于 2017年08月30日 · 2007 次阅读

最近公司要求使用 python 查询 oracle 数据库,下面把网上的资料整理一下:
1)python 安装 cx_Oracle 模块,可以下载离线包,最好在线 pip 安装。
2)安装 oracle 客户端:地址:http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html
这里有各种版本,结合自己的机器下载相应版本就好。我下载的是 32 位的 basic11 版本(注意要和自己 python 的版本相符,我自己电脑里面有 python2.7(32 位)和 python3.4(64 位));将解压好的文件夹路径加入环境变量(我的路径是:E:\instantclient_11_2),并且在该文件夹中新建一个文件 tnsnames.ora,内容是:
jasonChang =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = 10.130.201.118)(PORT = 1521))

)

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = tkpi)

)

)
3)代码连接数据库:
import cx_Oracle # 引用模块 cx_Oracle
conn=cx_Oracle.connect('tkinsure','ins185','10.137.146.5:1521/tkpi') # 连接数据库
rs=conn.cursor() # 获取 cursor
rs.execute('select sudo from tickl') # 使用 cursor 进行各种操作
result = rs.fetchall()
print(result)
rs.close() # 关闭 cursor
conn.close()

备注:如果在代码中遇到了莫名其妙的错误,请查看 oracle 客户端的版本是不是适合 python 版本,或者 python 和 cx_Oracle 是不是合适,因为我在运行代码的时候发现了一个错误:
conn = cx_Oracle.connect('tkinsure','ins185','10.137.146.5:1521/ursl')
UnicodeDecodeError: 'utf-8' codec can't decode bytes in position 82-83: invalid continuation byte,乍一看是编码的问题,实际上是 oracle 客户端版本(instantclient_11_2)和 python 版本不兼容的问题,其实归根揭底还是编码的问题啦!

共收到 4 条回复 时间 点赞
恒温 回复

说的对,谢谢您的建议

萤烛 回复

恩,是的,我也是纠结了好久才发现是 oracle 客户端的问题。谢谢兄台的指点!

python、cx_Oracle、instantclient 都必须是一样的编码才行,之前装的时候,python、cx_Oracle 是 64 位,instantclient 是 32 位的,被坑了一天,网上找了各种方法,什么替换 dll 文件什么的都不行,最后还是装了个 64 位的 instantclient

排版一下,更漂亮。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册