Skip to content

Hook base

Bases: ABC

Base class for Python application hooks. This class defines the interface for application hooks that can be implemented in Python. It requires the implementation of the run_hook method, which will be called during the migration process. It can call the execute method to run SQL statements with the provided connection and parameters.

Version Added

1.0.0

Source code in pum/hook.py
class HookBase(abc.ABC):
    """Base class for Python application hooks.
    This class defines the interface for application hooks that can be implemented in Python.
    It requires the implementation of the `run_hook` method, which will be called during the migration process.
    It can call the execute method to run SQL statements with the provided connection and parameters.

    Version Added:
        1.0.0
    """

    def __init__(self) -> None:
        """Initialize the HookBase class."""
        self._parameters: dict | None = None

    def _prepare(self, connection: psycopg.Connection, parameters: dict | None = None) -> None:
        """Prepare the hook with the given connection and parameters.
        Args:
            connection: The database connection.
            parameters: Parameters to bind to the SQL statement. Defaults to None.
        Note:
            Parameters are stored as a deep copy, any modification will not be used when calling execute.
        """
        self._connection = connection
        self._parameters = copy.deepcopy(parameters)

    @abc.abstractmethod
    def run_hook(self, connection: psycopg.Connection, parameters: dict | None = None) -> None:
        """Run the migration hook.
        Args:
            connection: The database connection.
            parameters: Parameters to bind to the SQL statement. Defaults to None.

        Note:
            Parameters are given as a deep copy, any modification will not be used when calling execute.
        """
        raise NotImplementedError("The run_hook method must be implemented in the subclass.")

    def execute(
        self,
        sql: str | psycopg.sql.SQL | Path,
    ) -> None:
        """Execute the migration hook with the provided SQL and parameters for the migration.
        This is not committing the transaction and will be handled afterwards.

        Args:
            sql: The SQL statement to execute or a path to a SQL file.
        """
        parameters_literals = SqlContent.prepare_parameters(self._parameters)
        SqlContent(sql).execute(
            connection=self._connection, parameters=parameters_literals, commit=False
        )

    execute.__isfinal__ = True

__init__

__init__() -> None

Initialize the HookBase class.

Source code in pum/hook.py
def __init__(self) -> None:
    """Initialize the HookBase class."""
    self._parameters: dict | None = None

execute

execute(sql: str | SQL | Path) -> None

Execute the migration hook with the provided SQL and parameters for the migration. This is not committing the transaction and will be handled afterwards.

Parameters:

Name Type Description Default
sql str | SQL | Path

The SQL statement to execute or a path to a SQL file.

required
Source code in pum/hook.py
def execute(
    self,
    sql: str | psycopg.sql.SQL | Path,
) -> None:
    """Execute the migration hook with the provided SQL and parameters for the migration.
    This is not committing the transaction and will be handled afterwards.

    Args:
        sql: The SQL statement to execute or a path to a SQL file.
    """
    parameters_literals = SqlContent.prepare_parameters(self._parameters)
    SqlContent(sql).execute(
        connection=self._connection, parameters=parameters_literals, commit=False
    )

run_hook abstractmethod

run_hook(connection: Connection, parameters: dict | None = None) -> None

Run the migration hook. Args: connection: The database connection. parameters: Parameters to bind to the SQL statement. Defaults to None.

Note

Parameters are given as a deep copy, any modification will not be used when calling execute.

Source code in pum/hook.py
@abc.abstractmethod
def run_hook(self, connection: psycopg.Connection, parameters: dict | None = None) -> None:
    """Run the migration hook.
    Args:
        connection: The database connection.
        parameters: Parameters to bind to the SQL statement. Defaults to None.

    Note:
        Parameters are given as a deep copy, any modification will not be used when calling execute.
    """
    raise NotImplementedError("The run_hook method must be implemented in the subclass.")