如何将Airflow连接到oracle数据库

Mas*_*sih 7 database oracle oracle11g airflow

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

根据他们的文档,我输入了我的主机名,后跟端口号和SID:

主持人:example.com:1524/sid

填补其他领域:

Conn类型:Oracle

架构:用户名(文档说明:使用您的用户名作为架构)

登录:用户名

密码:***

创建连接页面 - 气流

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

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

ORA-12514

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

版本:Airflow v1.7.0,Oracle11g

编辑:

我使用的是我在Oracle SQLDeveloper客户端中使用的相同主机名: Oracle客户端连接配置

Mas*_*sih 10

在深入研究源代码之后,最终它是如何为我工作的:

Conn类型:Oracle

主持人:example.com

schema:用户名

login:用户名

端口:端口号

extra:{"sid":"my sid","dsn":"example.com"}


kav*_*hmb 6

您的连接设置有问题,要么您的设置未正确加载到 oracle 挂钩,要么您缺少保存/加载连接设置的 python 包。您可以通过对凭据进行硬编码来对其进行测试。

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)
Run Code Online (Sandbox Code Playgroud)


lsa*_*mon 5

对于服务名称的使用,如果您将(端口、架构和额外)留空,您可以将完整的 oracle 连接描述符放在 Host 下:

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


Far*_*ate 5

这在额外的领域对我有用

{ "dsn":"192.168.x.x" , "service_name":"some.service.name" }
Run Code Online (Sandbox Code Playgroud)

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

  • 您应该将代码片段用反引号 (`) 包装起来,以使其更具可读性。 (2认同)