如何将 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
在气流服务器上。
我正在尝试使用 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
在气流服务器上。