【问题标题】:python: connecting to an Oracle database using Oracle's wallet/tnsnamespython:使用 Oracle 的 wallet/tnsnames 连接到 Oracle 数据库
【发布时间】:2018-12-13 15:58:15
【问题描述】:

所以我可以像这样连接到 Oracle 数据库:

import cx_Oracle as ora
dsnStr = ora.makedsn(host="ABC.COM", port="ABC_PORT", sid="ABC")
con = ora.connect(user="ABC_USER", password="ABC_PASSWORD", dsn=dsnStr)
print(con.version)
con.close()

这很好用,但我想使用 Oracle wallet/tnsnames/database.properties 进行连接(我来自 Java 世界)。到目前为止找不到任何关于如何实现这一目标的信息。另外,我如何根据这些Oracle wallet/tnsnames/database.properties各个文件的路径来“配置”cx_Oracle

【问题讨论】:

    标签: python database oracle database-connection cx-oracle


    【解决方案1】:

    我无法帮助将 Java 端转换为 cx_Oracle 所需的 C 端,但也许以下内容将有助于说明 cx_Oracle 需要什么。我将使用一个基于 Oracle Exadata Express 的示例,该示例使用钱包进行连接,请参阅将脚本语言连接到 Exadata Express here 的通用说明。

    您的确切配置和文件可能会有所不同。正如 Anthony 所指出的,安全设置并非特定于 cx_Oracle。更有经验和乐于助人的安全专家可能会潜伏在其他论坛中。

    对于 Exadata Express,会下载预先提供的钱包 zip 文件。对于像 cx_Oracle 这样的 Oracle 调用接口应用程序,我们只需要 zip 中的这些文件:sqlnet.ora、tnsnames.ora 和 cwallet.sso。您将需要创建/查找这些(或您需要的)文件。

    我的文件是:

    sqlnet.ora

    WALLET_LOCATION = (SOURCE = (METHOD = file)
                       (METHOD_DATA = (DIRECTORY="$TNS_ADMIN")))
    
    SSL_SERVER_DN_MATCH=yes
    

    tnsnames.ora

    dbaccess = (description=
              (address=(protocol=tcps)(port=1522)(host=whereever.com))
              (connect_data=(service_name=whereever2.com))   
              (security=(ssl_server_cert_dn="CN=wherever2.com,O=Oracle Corporation,L=Redwood Shores,ST=California,C=US"))  
           )
    

    cwallet.sso: 这个留给你想象吧……

    我将这三个文件放在/Users/cjones/Cloud 中,并设置环境找到它们:

    $ export TNS_ADMIN=/Users/cjones/Cloud
    

    现在我可以使用tnsnames.ora 文件中的连接名称进行连接:

    $ sqlplus -l cj/mypassword@dbaccess
    
    SQL*Plus: Release 12.2.0.1.0 Production on Fri Jul 6 10:20:21 2018
    
    Copyright (c) 1982, 2017, Oracle.  All rights reserved.
    
    Last Successful login time: Tue Jul 03 2018 13:00:06 +10:00
    
    Connected to:
    Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
    
    SQL>
    

    在 cx_Oracle 中,您的 dsn 也将是 dbaccess

    【讨论】:

      【解决方案2】:

      cx_Oracle 使用与 SQLPlus 相同的技术连接到数据库。因此,如果您发现这更容易,您可以先使用 SQL 进行测试

      为此,您需要创建一个 sqlnet.ora 配置文件。这允许您设置诸如wallet file 的位置等参数。环境变量 TNS_ADMIN 可用于指定此配置文件和其他配置文件(如 tnsnames.ora)的位置(如果在默认位置找不到)。请参阅documentation 了解更多信息。

      【讨论】:

      • 我已检查我是否可以使用 sqlplus 从本地计算机进行连接。不幸的是,cx_Oracle 在报告无效用户名/密码时遇到问题,就好像他看不到/读取钱包一样。有什么想法吗?
      • sqlplus 使用什么连接字符串? cx_Oracle 的连接字符串是什么?我想你是在同一台机器上使用相同的环境变量等等?
      • 由于所有这些都通过tnsnames.ora 进行,我相信sqlpluscx_Oracle 的连接字符串是相同的。通过重新启动我正在工作的机器解决了这个问题(耶!)。然后我可以通过简单的cx_Oracle.connect("/@THE_USER_NAME_FROM_TNSNAMES_ORA") 直接在 python 中连接。顺便说一句,cx_Oracle 文档似乎没有涉及这些内容。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-21
      • 2015-12-26
      • 2020-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多