Backend personalizado de XCom para Airflow

Ésto fue lo que hice para implementar un backend de XCom para Apache Airflow que guarda los datos en un bucket de Google Cloud Storage. La implementación es flexible, de manera que podemos especificar el nombre del bucket en una variable de Airflow XCOM_BACKEND_DATA_GCS_NAME y así desplegar múltiples instancias de Airflow o de Cloud Composer, cada una con su bucket definido en sí misma. Como éste ejemplo se trata de una instancia de Airflow en GCP Cloud Composer, la conexión al bucket mediante IAM ya está definida por el propio Cloud Composer y por lo tanto no tenemos que hacer nada más que especificarla en el GCSHook: google_cloud_storage_default. Si estuviéramos ejecutando Airflow en algo que no fuera GCP, deberíamos arreglar ésto aparte y crear un usuario IAM para que Airflow pudiera acceder al bucket. ...

March 9, 2023 · 3 min · José Luis Patiño Andrés

Aplicación en Docker con paquetes privados de GAR

En ocasiones, podemos necesitar acceder a entornos privados cuando estamos construyendo una imagen de Docker. Por ejemplo, instalar un paquete Python que está en un repositorio privado de Google Cloud Artifact Registry. Ésta referencia explica cómo hacerlo. Credenciales de Google Cloud Lo primero que vamos a necesitar son unas credenciales de GCP de una service account que tenga acceso a ese repositorio GAR privado. Una vez tengamos esas credenciales, que vienen en forma de un fichero JSON, podemos pasar al siguiente punto. ...

January 27, 2023 · 1 min · José Luis Patiño Andrés

Librería GeoPandas para análisis de datos GIS en Python

A continuación se muestra una serie de ejemplos útiles de uso de la librería Python GeoPandas. Activar soporte para ficheros KML GeoPandas utiliza la librería Fiona para cargar datos desde ficheros. Por defecto, Fiona tiene el soporte para ficheros KML desactivado. Por lo tanto si usamos la función read_file() de GeoPandas con un fichero KML nos devuelve un error. Para activar el soporte de estos ficheros KML, podemos ejecutar la siguiente sentencia en nuestro programa Python: ...

August 18, 2021 · 2 min · José Luis Patiño Andrés

Librería GDAL para desarrollo GIS

A continuación se muestra una pequeña referencia sobre la instalación y algunos ejemplos de uso de la librería GDAL. Instalación Necesitaremos la librería base del sistema, escrita en C++, la cual es usada por GDAL-Python durante su compilación. La podemos instalar mediante apt en sistemas Debian: sudo apt-get install libgdal1-dev Una vez instalada la librería del sistema ya podemos instalar GDAL-Python. Es mucho mejor utilizar pygdal, que es una versión actualizada más amigable con el sistema de instalación de pip: ...

July 29, 2021 · 1 min · José Luis Patiño Andrés

Ejemplos de uso de Pytest

A continuación se muestran algunos ejemplos de tests escritos con la librería Pytest. Son casos de uso especiales que resuelven algunas situaciones que pueden darse al escribir tests en proyectos Python. Usar fixtures sin necesidad de pasarlas como argumentos Normalmente, podemos pasar las fixtures que hayamos creado para nuestros tests como argumentos a las propias funciones de tests: En conftest.py: 1 2 3 4 5 6 7 8 9 10 from unitest.mock import patch import pytest @pytest.fixture def mock_api_call(): with patch("project.api_client.get_products") as mock_products: mock_products.return_value = ["Product-1", "Product-2", "Product-3] yield En test_products.py: ...

May 26, 2021 · 3 min · José Luis Patiño Andrés

Ejemplos y trucos de consultas a BD con SQLAlchemy

Uso de DISTINCT junto con ORDER BY para diferentes columnas En ocasiones es necesario hacer consultas que nos devuelvan un único resultado para el valor de una determinada columna, y además ordenar dichos resultados en base a una columna totalmente diferente. Este escenario presenta un problema: las columnas que hayan en la cláusula ORDER BY deben obligatoriamente ser las mismas que las de la cláusula DISTINCT. Y probablemente no queramos, o no podamos, poner las mismas columnas en ambas cláusulas, con lo cual nuestra consulta devolverá un error de este tipo: ...

May 12, 2021 · 6 min · José Luis Patiño Andrés

Referencia de uso de Poetry

Poetry es otra herramienta de CLI que sirve para gestionar dependencias y paquetes de terceros en proyectos Python. A continuación se muestra una pequeña referencia de uso básico de Poetry. Instalación Poetry viene con una especie de instalador personalizado que instala poetry de manera aislada. Ésta parece ser la forma recomendada de instalarlo. Para ello podemos seguir las instrucciones en la documentación de Poetry. De otro modo, simplemente podemos instalarlo con pip: ...

May 6, 2021 · 2 min · José Luis Patiño Andrés

Referencia de uso de Pipenv

Pipenv es una herramienta de CLI que soluciona algunos problemas derivados de la gestión de dependencias (paquetes externos) en proyectos Python. A continuación se añade una pequeña referencia de cómo usar Pipenv. Instalación Basta con instalar Pipenv mediante pip: pip install pipenv Configuración Realmente no es necesario hacer ningún cambio de configuración para Pipenv tal como viene por defecto pero, si se quiere, se pueden usar las variables de entorno que se describen en la documentación de Pipenv. ...

May 5, 2021 · 3 min · José Luis Patiño Andrés

Migraciones de base de datos con Alembic

Manual de uso de la herramienta Alembic. Inicio del entorno Alembic Instalación Instalar mediante pip: ```bash pip install alembic Inicialización y puesta a punto Inicializar el entorno de trabajo de Alembic: ```bash cd directorio/del/proyecto alembic init alembic O también, si queremos usar Alembic con un controlador de BD asíncrono, el comando es: ```bash alembic init -t async alembic Se puede consultar la documentación oficial aquí. Esto crea un nuevo directorio llamado alembic/ y un fichero alembic.ini, ambos en el directorio/del/proyecto. El directorio `alembic tiene este contenido: ...

April 3, 2021 · 2 min · José Luis Patiño Andrés

Concurrencia en Python con gevent

gevent es una librería de networking de Python basada en co-rutinas que usa “greenlets” para proporcionar una API de alto nivel para sincronizar tareas. Ejemplo de uso 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import gevent def do_something_async(*args, **kwargs): # Hacer lo que quieras aquí... jobs = [ gevent.spawn( do_something_async, n, arg_1, arg_2, arg_3, ... kwarg_1, kwarg_2, kwarg_3, ... ) for n in whatever ] gevent.joinall(jobs, raise_error=True)

February 5, 2012 · 1 min · José Luis Patiño Andrés