【发布时间】: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_usr和ora_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