[PowerBi] Descargar reporte o modelo semantico via API como proyecto TMDL

Guardar Power Bi Desktop como proyecto es la nueva tendencia y el futuro al que queremos llegar. No es una moda, sino una forma robusta de persistir el código de forma íntegra que nos permite utilizar mejores prácticas como versionado.

Sabemos como hacerlo desde power bi desktop, pero como hacemos si queremos obtenerlo desde Fabric o Power Bi Service. Tal vez aún tenemos muchos archivos pbix dando vueltas o inclusive lo perdimos al original. Puede que querramos iniciarnos convirtiendo muchos archivos en este estado, pero abrir uno por uno no es viable. Necesitamos automatizar este proceso.

En este artículo veremos como podemos descargar un report o modelo semántico desplegado en todos sus archivos de proyecto utilizando la Fabric/PowerBi Rest API y la librería SimplePBI de python.

Para poder comenzar con esta solución primero necesitamos conocer un poco la Fabric o Power Bi API y tener conocimientos básicos en Python. La solución consiste en delimitar un modelo semántico o reporte en una área de trabajo y ejecutar un sencillo script a una dirección de nuestro entorno local. De ésta forma si descargaramos un reporte y un modelo semántico de un informe de, digamos, Roger Federer, veríamos algo así en nuestro entorno:

SI nunca usaste la API y no sabes de lo que hablo, tenes dos formas de utilizarla, logueando con service principal o tus credenciales permitidas por un administrador. En estos dos artículos podes introducirte:

SimplePBI ha trabajado para que la experiencia sea super sencilla y funcione en casos que normalmente descargar archivo pbix no funcionaría (incremental refresh).

Veamos cuando simple sería nuestro código:

Iniciamos cargando los objetos de la librería, delimitando las variables de conexión del service principal y creamos los objetos de las categorías de API que vamos a utilizar.

El resto es super sencillo, solo nos resta llamar el método declarando un path local de descarga y una sola línea de código:

sem.save_semantic_model_definition_local("xxxxxx", "xxxxxx", path)

De la misma forma podemos llamar el método de reporte:

rep.save_report_definition_local("xxxxxx", "xxxxxx", path, report_connection=None)

La operación de reportes suele tardar un poco más que la de modelos. Los reportes están atados a la cantidad de páginas y visuales en tiempo de descarga porque genera más archivos.

Con reportes hay que tener presente un parámetro especial para delimitar si queremos que nuestro archivo pbir apunte al modelo semántico en Fabric (live connection) o si preferimos que lo busque en nombrereporte.SemanticModel. Por defecto el none asume conectarse al modelo semántico en el portal de Fabric. Si quisieramos que no haga live connection sino más bien que busque dentro de la carpeta su modelo, habría que agregar un parámetro:

rep.save_report_definition_local("xxxxxx", "xxxxxx", path, report_connection="Import")

Esta solución podría ayudarnos a sincronizar una área de trabajo completa. Podríamos listar los reportes o modelos semánticos de una área de trabajo. Iterar los elementos. Guardar todos los ítems en una carpeta. Idealmente sería una carpeta "Workspaces/[Nombre Area de trabajo]" dentro de un repositorio Git.

De esa forma podríamos versionar toda una área de trabajo muy rápidamente. De igual manera a los reportes

Corriendo esos dos bucles en menos de un minuto podría tener mi área de trabajo lista para versionar en un repo.

NOTA: al descargar una área completa, debemos tener precaución en los informes. Si tenemos mezcla de informes importados y live connection, entonces vamos a tener que ejecutar acciones más manuales para esos casos individuales que sean minoría.

Así es como podemos descargar reportes y modelos semánticos como si fueran guardados como proyecto desde Fabric o Power Bi con una línea utilizando la Fabric/PowerBi Rest API y la librería de python SimplePBI.