【问题标题】:Python Problems Connecting to Oracle (cx_Oracle and Pyodbc)连接到 Oracle 的 Python 问题(cx_Oracle 和 Pyodbc)
【发布时间】:2016-06-01 10:23:43
【问题描述】:

使用 Python 3.4 连接到 Oracle 11(64 位),但无论我尝试什么,我似乎都无法连接。我尝试了 cx_Oracle 包和 pyodbc 包都没有成功。

尝试使用 cx_Oracle

conn = cx_Oracle.connect('username/password@server')

和

        oradsn = cx_Oracle.makedsn(host, port, server)
        conn = cx_Oracle.connect(user="username, password=password, dsn=oradsn")

错误:无法获取 Oracle 环境句柄


尝试使用pyodbc

conn = pypyodbc.connect('DRIVER={ORACLE ODBC DRIVER};DBQ=dsn name;UID=username;PWD=password')

和

conn = pyodbc.connect('DSN=dsn;SERVER=server;UID=username;PWD=password')

错误:由于系统错误 1114,无法加载指定的驱动程序:动态链接库 (DDL) 初始化例程失败。 (


环境变量:

ORACLE_HOME = C:\Oracle\Ora11_x64

有什么建议吗?

谢谢

【问题讨论】:

    标签: python oracle odbc pyodbc cx-oracle


    【解决方案1】:

    首先,在 Windows 上,不要使用环境变量 ORACLE_HOME。那应该只在 Linux/Unix 平台上使用。您应该改用 PATH 环境变量。

    其次,使用 SQL*Plus 确认您能够连接到数据库。有很多页面讨论了如何做到这一点。这是一个:

    http://penguinman-techtalk.blogspot.ca/2009/02/sqlplus-connection-to-remote-oracle.html

    最后,如果你想使用makedsn你需要做到以下几点:

    dsn = cx_Oracle.makedsn(host, port, server)
    conn = cx_Oracle.connect(user, pwd, dsn)
    

    如果您只是想连接到由本地 tnsnames.ora 文件(称为 tnsentry)引用的数据库,您可以执行以下操作:

    conn = cx_Oracle.connect(user, pwd, tnsentry)
    

    或

    conn = cx_Oracle.connect("user/pwd@tnsentry")
    

    【讨论】:

    • 感谢您的回答!几个问题: 1. PATH 变量应该是什么样的? 2. 我无法通过 SQL Plus 连接(TNS 适配器错误(?))。但是,我可以通过 Oracle SQL Developer 进行连接。不知道这意味着什么。
    • PATH 环境变量应包含 SQLPlus 可执行文件和客户端库的位置。 SQL Developer 使用 Java,而 SQLPlus(和 cx_Oracle)使用 OCI,因此它们使用不同的连接方法。 TNS 适配器错误仅表示您的连接字符串错误。如果您提供有关如何连接的详细信息,这可能会帮助我进一步帮助您。 :-)
    • 好的,我改变了我的连接字符串并且能够连接到 SQLPlus!好消息。但我仍然收到“无法获取 Oracle 环境句柄错误”。我的 PATH 变量在字符串中有 'C:\Oracle\Ora11_x64\BIN'。我应该提到 tnsnames.ora 文件不包含我的连接,并且我没有更改该文件的访问权限。我还能使用 Cx_oracle 进行连接吗?
    • 我还应该提到,我正在使用 pyinstaller 创建一个 .exe 文件并在不同的系统(安装了 oracle)上运行它
    • 已解决:问题是 pyinstaller 在创建可执行文件时引入了 OCI.dll 文件。一旦我从 pyinstaller 冻结中删除了该 OCI.dll 文件,连接就会起作用。更多信息在这里:mail.python.org/pipermail/tutor/2014-December/103608.html
    【解决方案2】:

    我的问题最终是 pyinstaller 与 Cx_oracle 一起使用。我正在从我的 python 脚本创建一个可执行文件,结果发现 pyinstaller 包含一个 OCI.dll 文件。一旦我更改了 Pyinstaller 以删除该文件,其他系统上的所有内容都与可执行文件连接良好。

    更多信息在这里:https://mail.python.org/pipermail/tutor/2014-December/103608.html

    ^^在上面的示例中,他添加了一个 .dll 文件,但我发现我的可以通过删除 OCI.dll 文件并忽略他正在谈论的另一个文件来工作

    以及如何更改 pyinstaller:https://pythonhosted.org/PyInstaller/#using-spec-files

    【讨论】:

      猜你喜欢
      • 2012-09-16
      • 2019-12-27
      • 2020-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多