如何将Airflow连接到Oracle数据库

10

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

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

主机:example.com:1524/sid

填写其他字段为:

Conn类型:Oracle

模式:username ( 文档中说:用你的用户名作为模式)

登录:username

密码: * * *

创建连接页面--Airflow

设置连接后,每次尝试执行查询时,它都会给出相同的错误代码(ORA-12514)。看起来Oracle不允许Airflow连接:

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

ORA-12514

有人之前遇到过同样的问题吗?像这样的大型平台连接数据库不应该是问题。或者我可能做错了什么。谢谢。

版本:Airflow v1.7.0,Oracle11g

编辑:

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


通常这意味着你的连接不正确或者数据库上的监听器设置错误。你的数据库监听器是否期望一个完全限定名称? - T Gray
@TGray 这正是我在Oracle SQL Developer中使用的主机名(我还添加了另一个来自Oracle客户端配置的截图)。 - Masih
我将引用stackoverflow上的这个答案:https://dev59.com/ymgv5IYBdhLWcg3wMN0U - T Gray
5个回答

16
在深入研究源代码后,以下是最终对我有效的操作步骤:
连接类型:Oracle 主机名:example.com
模式名称:username 登录名:username 端口号:端口号
额外信息:{"sid": "my sid", "dsn": "example.com"}

什么是 DSN - 它是否使用 ODBC 类型的连接?使用服务名称的连接呢? - Tagar
你的回答中有“dsn”,而不是“dns”。我知道dns是什么。我的问题是关于Airflow连接到Oracle数据库的。Oracle没有“DSN”或“数据源名称”这个术语,这是ODBC的术语。这就是为什么我问的原因。谢谢。 - Tagar
1
对不起,我无法翻译您提供的内容。这是波斯语,而不是英语。 - Aramis NSR
@YongWang 你能否更新一下你是如何解决Oracle钩子问题的?我也遇到了同样的问题,但是不知道该怎么做。 - pm1359
我认为有两个步骤:首先,您必须确保已安装cx_oracle和oracle_client库;其次,在airflow oracle连接中,除了正常的输入外,您还需要在额外的输入块中输入json格式的配置,如下所示:{"dsn": "IP或名称","service_name": "your_service_name","encoding": "UTF-8"}。 - Yong Wang
显示剩余2条评论

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)

1
感谢您提供源代码的参考!它回答了我所有的问题。 - Tagar
抱歉,我无法翻译此内容。这是波斯语,而不是英语。 - Aramis NSR

5

在服务名称使用方面,如果您将(端口、模式和额外信息)留空,您可以在“主机”下放置完整的Oracle连接描述符:

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


5

2
你应该使用反引号(`)将代码片段包裹起来,以使其更易读。 - Swifty

4
如果有人在Ad hoc查询下拉列表中看不到连接,需要在airflow服务器上安装适配器:pip install cx_Oracle

1
在我的情况下,缺少了numpy,所以pip install numpy解决了这个问题。 - Mesa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接