如何将 Airflow 连接到 oracle 数据库

How to Connect Airflow to oracle database

我正在尝试使用 Airflow 创建到 oracle 数据库实例 (oracle:thin) 的连接。

根据他们的 documentation 我输入了我的主机名,然后是端口号和 SID:

主机:example.com:1524/sid

将其他字段填写为:

连接类型:Oracle

架构:用户名(documentation 说:使用您的用户名作为架构)

登录:用户名

密码: * * *

建立连接后,它会为我尝试执行的每个查询提供保存错误代码 (ORA-12514)。 好像oracle不让airflow连接:

ORA-12514: TNS:listener 当前不知道连接描述符中请求的服务

有没有人遇到过同样的问题。我的意思是连接到数据库对于像这样的大平台来说应该不是问题。或者我可能做错了什么。谢谢

版本:Airflow v1.7.0,Oracle11g

编辑:

我使用的主机名与我在 Oracle SQLDeveloper 客户端中使用的主机名相同:

您的连接设置有问题,您的设置没有正确加载到 oracle 挂钩,或者您缺少 python 连接设置的 save/load 包。您可以通过硬编码您的凭证来测试它。

https://github.com/airbnb/airflow/blob/master/airflow/hooks/oracle_hook.py

conn = self.get_connection(self.oracle_conn_id)
dsn = conn.extra_dejson.get('dsn', None)
sid = conn.extra_dejson.get('sid', None)
service_name = conn.extra_dejson.get('service_name', None)
if dsn and sid and not service_name:
    dsn = cx_Oracle.makedsn(dsn, conn.port, sid)
    conn = cx_Oracle.connect(conn.login, conn.password, dsn=dsn)
elif dsn and service_name and not sid:
    dsn = cx_Oracle.makedsn(dsn, conn.port, service_name=service_name)
    conn = cx_Oracle.connect(conn.login, conn.password, dsn=dsn)
else:
    conn = cx_Oracle.connect(conn.login, conn.password, conn.host)

深入研究源代码后,这就是它最终对我有用的方式:

连接类型:Oracle

主持人:example.com

架构:用户名

登录:用户名

端口:端口号

额外:{"sid":"my sid","dsn":"example.com"}

对于服务名称的使用,如果将 (port, schema and extra) 留空,则可以将完整的 oracle 连接描述符放在 Host 下:

(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = mysidname)))

这在额外的领域对我有用

{ "dsn":"192.168.x.x" , "service_name":"some.service.name" }

我从https://github.com/apache/airflow/blob/master/airflow/hooks/oracle_hook.py#L49

如果有人在临时查询下拉列表中看不到连接 - 您需要安装适配器:pip install cx_Oracle 在气流服务器上。