如何通过 Python 连接到 Oracle ADW 云数据库?

How do you connect to an Oracle ADW cloud database via Python?

我找到了这个 website,它表明我可以使用 python 连接到我的 Oracle ADW 云数据库。我尝试 运行ning 下面的代码,但 运行ning 仍然出现相同的错误。有人对如何解决这个问题有任何见解吗?注意:密码已更改,原因显而易见。

Jupyter 笔记本中的代码:

import cx_Oracle as cx
import pandas as pd
import warnings
warnings.filterwarnings('ignore')
pswd = 'ABC'

#Connect to Autonomous Data Warehouse 
con = cx.connect(user = 'ADMIN', password = pswd)
query = 'SELECT * from TEST123'
data_train = pd.read_sql(query, con=con)

错误:

DatabaseError: Error while trying to retrieve text for error ORA-01804

当我 运行 下面的代码时,我得到同样的错误:

...
#Connect to Autonomous Data Warehouse 
con = cx.connect('ADMIN',pswd,"mltest_high")
query = 'SELECT * from TEST123'
data_train = pd.read_sql(query, con=con)

根据错误编号和未找到消息文本的事实进行猜测,cx_Oracle 正在使用 Oracle Instant Client 库,但您将 ORACLE_HOME 环境变量设置为其他软件.如果是这样,请取消设置 ORACLE_HOME。或者您可能只使用本地 Oracle 数据库安装中包含的库并且没有完全设置 Oracle 环境变量,例如尚未设置 ORACLE_HOME。或者您可能需要更新版本的 Oracle 客户端库 - 获取 19c 库,例如 Oracle Instant Client。另请检查有关 ORA-1804 的其他 Whosebug 问题。如果您使用有关您在计算机 运行 Python 上安装的 Oracle 软件的信息更新您的问题,可能会得到更详细的答案。

听起来你已经为连接整理了云钱包,但这里是阅读你的标题后遇到这个问题的人的参考:

所以这需要大量的教育才能弄清楚,特别是当涉及到 Oracle 钱包如何与 SLQNET.ora 和 TNS_NAMES.ora 文件结合系统环境变量内联工作时,但是 this website 确实在 visual studio 代码中得到了我的 python(在 .ipynb 中),以便能够连接到 Oracle 的云 ADW 系统。这几乎正​​是我为了让它在我的机器上工作所做的,但我没有做虚拟环境。我不得不想出一个解决上述问题的方法,但我能够使用系统 link 到我的目录中。

重要的是要知道您需要做这些事情才能使其正常工作。当您从 ADW 下载钱包时,您需要从 TNS_NAMES 复制 high/medium/low 行并将其粘贴到您的 Oracle/network/admin/tns_names.ora 文件中。您还需要从 sqlnet.ora 文件中获取钱包信息和 ssl 服务器,并将其也放入 Oracle/network/admin/ 目录下的 sqlnet.ora 文件中。如果您选择不使用 post 中演示的虚拟环境,要获取目录 link,为了使钱包信息行正常工作,您需要将该目录设置为钱包文件夹。我解压了我的;不确定是否需要。

最后,您需要将 TNS_NAMES 的系统环境变量设置为 tns_names.ora 和 sqlnet.ora 系统文件所在的位置(不是钱包下载文件夹中的文件) ), 可能在 Oracle\network\admin.

下面是对我有用的代码。我希望这对其他人有帮助,并且他们不必像我一样经历同样的麻烦才能弄清楚。

import cx_Oracle
import os
import pandas as pd

os.environ.get('TNS_ADMIN')
connection = cx_Oracle.connect('<Oracle ADW Username', '<Oracle ADW Password>', '<TNS_NAME entry (high/med/low)>')

cursor = connection.cursor()
rs = cursor.execute("SELECT * FROM TEST123")
df = pd.DataFrame(rs.fetchall())
df