es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo conectar Cloud Composer Airflow a una base de datos Oracle?

Estoy intentando conectarme a una base de datos oracle con un trabajo de python en GCP airflow.

Aunque lo intenté tanto con OracleOperator como con OracleHook, siempre obtengo el mismo error.

Puedes ver el error y mi código a continuación.
¿Cómo puedo resolver este error en GCP Cloud Composer?

Ten en cuenta que no realicé estas operaciones en mi computadora local.

Además, ¿cómo puedo imprimir el resultado de una consulta select que envié a la base de datos oracle?
Gracias de antemano.

Mi Código:

from airflow.utils.dates import days_ago
from datetime import datetime, timedelta
from airflow import DAG
from airflow.operators.oracle_operator import OracleOperator

default_args = {
'owner': 'AirflowTest',
'depends_on_past': False,
'start_date':  days_ago(1),
'email': ['AirflowTest@AirflowTest.com'],
'email_on_failure': True,
'email_on_retry': False,
'retries': 1,
'retry_delay': timedelta(minutes=5)
}

schedule_interval = "* * * * *"

dag_gtb = DAG(
    'AirflowTestPythonJob',
    default_args=default_args,
    schedule_interval=schedule_interval
    )

oracle_opr = OracleOperator(
    task_id='task_sql',
    oracle_conn_id='oracle_connection',
    sql='select * from temp_table',
    autocommit='True',
    dag=dag_gtb)

oracle_opr

El Error:

cx_Oracle.DatabaseError: DPI-1047: No se puede localizar una biblioteca de cliente de Oracle de 64 bits: "libclntsh.so: no se puede abrir el archivo de objeto compartido:
No existe tal archivo o directorio". Consulta https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html para obtener ayuda.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El error indica que no se puede encontrar la biblioteca de cliente Oracle de 64 bits. Esto se debe a que las bibliotecas de Oracle no están instaladas en el entorno de Cloud Composer de forma predeterminada.

    Para resolver este error, debes instalar las bibliotecas de Instant Client de Oracle en el entorno de Cloud Composer. Puedes seguir las instrucciones proporcionadas en el enlace mencionado en el mensaje de error.

    Una vez instaladas las bibliotecas, puedes usar OracleHook o OracleOperator para conectarte a la base de datos y ejecutar tus consultas. Para imprimir el resultado de una consulta tipo select que envías a la base de datos Oracle, puedes almacenar el resultado en una variable e imprimirlo. Aquí tienes un ejemplo:

    from airflow.decorators import dag
    from airflow.utils.dates import days_ago
    from datetime import datetime, timedelta
    from airflow.models import BaseOperator
    from airflow.utils.decorators import apply_defaults
    from airflow.providers.oracle.hooks.oracle import OracleHook
    
    default_args = {
        'owner': 'airflow',
        'depends_on_past': False,
        'start_date': days_ago(1),
        'retries': 1,
        'retry_delay': timedelta(minutes=5)
    }
    
    dag = DAG(
        'oracle_connection_example',
        default_args=default_args,
        description='Un ejemplo de DAG para conectarse a Oracle usando OracleHook',
        schedule_interval=None,
        start_date=days_ago(2),
        catchup=False
    )
    
    class OracleExampleOperator(BaseOperator):
    
        @apply_defaults
        def __init__(self, **kwargs):
            super().__init__(**kwargs)
    
        def execute(self, context):
            hook = OracleHook(oracle_conn_id='oracle_test')
            conn = hook.get_conn()
            cursor = conn.cursor()
            cursor.execute("SELECT * FROM my_table")
            rows = cursor.fetchall()
            for row in rows:
                print(row)
    
    oracle_example_task = OracleExampleOperator(
        task_id='oracle_example_task',
        dag=dag
    )
    

    En este ejemplo, estamos utilizando OracleHook para conectarnos a la base de datos y ejecutar una consulta select. Luego almacenamos el resultado en la variable rows, que es una lista de tuplas. Iteramos a través de esta lista e imprimimos cada tupla.

    Ten en cuenta que debes reemplazar el ID de conexión ‘oracle_test’ por el ID de la conexión Oracle creada en la página de Conexiones de Airflow.

Comments are closed.