Win10下使用Python连接Oracle

前言

本来以为写篇这个就够了 Python离线安装第三方库,后来发现还有好多坑,还是全记一下吧。使用python连接oracle有很多种方式,本文使用的是cx-Oracle。此外,本文完全是在不能连外网的情况下操作的,能连外网没有这么麻烦。

正文

1 cannot import name ‘SourceDistribution’

本来在linux上配置好了所有环境,把python包全拷到windows下后发现不能直接用,还得重新安装cx-Oracle,如 Python离线安装第三方库写的那样,我先用能连外网的笔记本在https://pypi.org/project/cx-Oracle/7.3.0/#files下载了whl包,然后传到了不能连外网的机器上,而安装时报了如下错误:
pip install ImportError: cannot import name ‘SourceDistribution’

pip install d:\xx\xx.whl

查了下说是pip版本的问题,需要升级。
那么第一个问题来了,再使用这种方式通过有问题的pip离线安装升级pip肯定是不行的,怎么办呢?
然后我使用了Python离线安装第三方库中写的第三种方式,源码安装升级pip,然后再安装cx-Oracle。

2 DPI-1047: Cannot locate a 64-bit Oracle Client library

cx_Oracle.DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library: "D:\xx\oci.dll is not the correct architecture
查了下说是Oracle Client版本不对,要和python一致,python是64位,Oracle Client也需要是64位,小问题,去官网下载:https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html
然而坑又来了,下载需要注册oracle账户,注册完后登录,oracle官网又出问题了,下载不了。
在这里插入图片描述
找了半天终于在csdn上找到一个64位的,下载然后传到不能联网的机器上。然而,又出问题了,见下。

3 make sure you have the 32 bits oracle client installed

用64位替换了32位的oracle客户端后,cx-Oracle没问题了,而PLSQL Developer并不支持Oracle 64位客户端连接,冲突了,这不是为难我胖虎吗?
还好机智的我想起来可以在plsql里设置oci库,我把它改成了32位的,环境变量里配置64位的,这样就完美共存了。
在这里插入图片描述

4 ORA-12154: TNS

cx_Oracle.DatabaseError: ORA-12154: TNS

这个问题也有点坑,在linux下ora_addr需写成"ip:port/orcl",而windows下需写成实例名,就是tnsnames.ora里配置的。
在这里插入图片描述
例子:

# -*- coding: utf-8 -*-
# @Time    : 2020/12/12 16:14
# @Author  : drguo
# @FileName: test.py
# @Software: PyCharm
# @blog :drguo.blog.csdn.net
import cx_Oracle

ora_name = ""
ora_pasw = ""
# linux
# ora_addr = "ip:port/orcl"
# windows 写实例名
ora_addr = "xx-log"

# 查询oracle
def ora_query(sql_log):
    print(sql_log)

    conn = cx_Oracle.connect(
        '{ora_name}/{ora_pasw}@{ora_addr}'.format(ora_name=ora_name, ora_pasw=ora_pasw, ora_addr=ora_addr))
    curs = conn.cursor()
    res = curs.execute(sql_log)
    row = res.fetchone()
    curs.close()
    conn.close()
    return row


if __name__ == '__main__':
    res1 = ora_query("select * from ETL_JOB_STATUS t where t.etl_job='audit_fraud_outbound_d_s'")
    print res1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光于前裕于后

您的打赏将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值