pbi-cli/src/pbi_cli/commands/database.py
MinaSaad1 d5574d2e9a feat: add pbi database diff-tmdl command (v3.9.0)
Pure-Python TMDL folder diff for CI/CD model change reporting.
No Power BI Desktop connection required. Handles direct and
SemanticModel folder layouts, strips lineageTags to avoid false
positives, and keys relationships by fromColumn->toColumn instead
of GUIDs. 18 tests covering all diff scenarios.
2026-04-01 22:27:57 +02:00

77 lines
2.6 KiB
Python

"""Database-level operations: list, TMDL import/export, TMSL export."""
from __future__ import annotations
import click
from pbi_cli.commands._helpers import run_command
from pbi_cli.main import PbiContext, pass_context
@click.group()
def database() -> None:
"""Manage semantic models (databases) at the top level."""
@database.command(name="list")
@pass_context
def database_list(ctx: PbiContext) -> None:
"""List all databases on the connected server."""
from pbi_cli.core.session import get_session_for_command
from pbi_cli.core.tom_backend import database_list as _database_list
session = get_session_for_command(ctx)
run_command(ctx, _database_list, server=session.server)
@database.command(name="import-tmdl")
@click.argument("folder_path", type=click.Path(exists=True))
@pass_context
def import_tmdl(ctx: PbiContext, folder_path: str) -> None:
"""Import a model from a TMDL folder."""
from pbi_cli.core.session import get_session_for_command
from pbi_cli.core.tom_backend import import_tmdl as _import_tmdl
session = get_session_for_command(ctx)
run_command(ctx, _import_tmdl, server=session.server, folder_path=folder_path)
@database.command(name="export-tmdl")
@click.argument("folder_path", type=click.Path())
@pass_context
def export_tmdl(ctx: PbiContext, folder_path: str) -> None:
"""Export the model to a TMDL folder."""
from pbi_cli.core.session import get_session_for_command
from pbi_cli.core.tom_backend import export_tmdl as _export_tmdl
session = get_session_for_command(ctx)
run_command(ctx, _export_tmdl, database=session.database, folder_path=folder_path)
@database.command(name="diff-tmdl")
@click.argument("base_folder", type=click.Path(exists=True, file_okay=False))
@click.argument("head_folder", type=click.Path(exists=True, file_okay=False))
@pass_context
def diff_tmdl_cmd(ctx: PbiContext, base_folder: str, head_folder: str) -> None:
"""Compare two TMDL export folders and show what changed.
Useful for CI/CD to summarise model changes between branches:
pbi database diff-tmdl ./base-export/ ./head-export/
No Power BI Desktop connection is required.
"""
from pbi_cli.core.tmdl_diff import diff_tmdl_folders
run_command(ctx, diff_tmdl_folders, base_folder=base_folder, head_folder=head_folder)
@database.command(name="export-tmsl")
@pass_context
def export_tmsl(ctx: PbiContext) -> None:
"""Export the model as TMSL."""
from pbi_cli.core.session import get_session_for_command
from pbi_cli.core.tom_backend import export_tmsl as _export_tmsl
session = get_session_for_command(ctx)
run_command(ctx, _export_tmsl, database=session.database)