【问题标题】:Trying to connect to Oracle Always Free database using cx_Oracle尝试使用 cx_Oracle 连接到 Oracle Always Free 数据库
【发布时间】:2021-10-04 12:16:39
【问题描述】:

我有一个来自 Oracle 的始终免费匿名数据库,我正在尝试使用 cx_Oracle 在 Python 中连接到它。

这是我的代码:

import cx_Oracle as cx

#getting the instant client
currentpath = os.path.dirname(os.path.abspath(__file__))
clientpath = os.path.join(currentpath, "instantclient_19_11")
cx.init_oracle_client(lib_dir=clientpath)
#easy connect string
connect_string = "tcps://adb.uk-london-1.oraclecloud.com/t3ulea4zs7iolax_db202008251748_high.atp.oraclecloud.com?wallet_location=/Users/georg/Downloads/Wallet&retry_count=20&retry_delay=3"
userpwd = "(my password)"

def dbConnect():
    con = cx.connect("ADMIN", userpwd, connect_string, encoding="UTF-8")
    print("connection successful")
    return con

con = dbConnect()

我得到的错误信息是: cx_Oracle.DatabaseError: ORA-12506: TNS:listener rejected connection based on service ACL filtering

这让我很困惑,因为我的数据库设置为允许从任何地方进行安全访问:

"访问类型: 允许从任何地方进行安全访问”

我真的不确定我做错了什么。任何帮助表示赞赏。如果需要更多信息,请告诉我。

【问题讨论】:

  • 您需要将TNS_ADMIN环境变量设置为您的钱包文件的位置,然后在连接时使用通用TNS条目。我是这样使用的:db.connect(os.environ["ora_cloud_usr"], os.environ["ora_cloud_pwd"], "test_low", encoding="UTF-8" ).
  • 您好,感谢您的回复 - 我已将 TNS_ADMIN 环境变量设置为我的钱包文件夹并使用了您的代码,但现在我收到了 KeyError。
  • 我的代码使用的用户名和密码分别设置为环境变量ora_cloud_usrora_cloud_pwd。只需将它们替换为实际的用户名和密码即可。
  • 我试过了,然后我把它恢复到我原来的代码,现在它可以工作了吗?不知道我做了什么。对不起,如果我浪费了你的时间哈哈
  • 您使用的是 Easy Connect 语法,因此您无需设置 TNS_ADMIN。我在您的问题中没有看到连接字符串中的端口号;真的是默认的1521吗?作为一般参考,这里有一篇文章展示了如何为 Oracle ABD 连接创建 Easy Connect 字符串:blogs.oracle.com/opal/…,这里是云连接上的 cx_Oracle 文档cx-oracle.readthedocs.io/en/latest/user_guide/…

标签: python database oracle cloud cx-oracle


【解决方案1】:

从我的评论中给出详细信息:如果您的 tnsnames.ora 文件包含以下条目:

cjjson_high = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.ap-sydney-1.oraclecloud.com))(connect_data=(service_name=abc_cjjson_high.adb.oraclecloud.com))(security=(ssl_server_cert_dn="CN=adb.ap-sydney-1.oraclecloud.com,OU=Oracle ADB SYDNEY,O=Oracle Corporation,L=Redwood City,ST=California,C=US")))

然后你可以使用连接

connect_string, = 'tcps://adb.ap-sydney-1.oraclecloud.com:1522/abc_cjjson_high.adb.oraclecloud.com?wallet_location=/Users/cjones/Cloud/CJJSON&retry_count=20&retry_delay=3'
con = cx_Oracle.connect("ADMIN", userpwd, connect_string)

使用此语法,您只需要下载云钱包中的 cwallet.sso 文件。您不需要 tnsnames.ora 或 sqlnet.ora 文件。您也不需要设置 TNS_ADMIN。您只需将连接字符串中的/Users/cjones/Cloud/CJJSON 更改为包含您的 cwallet.sso 的目录

请参阅博客文章 How to connect to Oracle Autonomous Cloud Databases,其中提供了有关获取钱包的信息和 cx_Oracle 文档 Connecting to Oracle Cloud Autononmous Databases

脚注:encoding 参数在 cx_Oracle 8 及更高版本中默认为 UTF-8。

【讨论】:

    猜你喜欢
    • 2020-02-06
    • 2020-08-10
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 2016-06-12
    相关资源
    最近更新 更多