Skip to main content

Lightweight and extensible Python library for managing database migrations

Project description

Python versions Test

๐Ÿ› ๏ธ Migropy

Migropy is a lightweight and extensible Python library for managing database migrations.
Designed for simplicity and flexibility, it helps teams apply, track, and version-control schema changes across multiple environments.


๐Ÿ“š Table of Contents


๐Ÿš€ Features

  • โœ… Versioned migrations with up/down support
  • โœ… Compatible with PostgreSQL & MySQL
  • โœ… CLI for common migration operations
  • โœ… Safe and idempotent execution
  • โœ… Customizable migration directory structure

๐Ÿ“ฆ Installation

pip install migropy

๐Ÿ“– How to use - CLI

1. Initialize a new migration project

This command will create a new directory called migropy with the necessary files to manage your migrations & db parameters.

migropy init <optional_migration_directory_name>

2. Fill the config.ini file

This file is generated in your current directory and contains the database connection parameters and the path to the migration

[database]
# database connection parameters
# available types: postgres, mysql
host = localhost
port = 5432
user = postgres
password = postgres
dbname = my_database
type = postgres # or mysql

[migrations]
# path to migration scripts
# use forward slashes (/) also on windows to provide an os agnostic path
script_location = migropy
# option available with postgres
base_schema = public

[logger]
# available levels: DEBUG, INFO, WARNING, ERROR, CRITICAL
level = INFO

3. ๐Ÿ” Using a .env file or environment variables

Migropy supports environment variables and .env files to avoid committing credentials or secrets to your repository.

This allows usage in:

  • Local development
  • CI/CD pipelines
  • Docker
  • Production environments

๐Ÿ”Ž How it works

Migropy loads configuration in this order:

  1. Environment variables
  2. .env file (if present in the current working directory)

๐Ÿ‘‰ Environment variables always override values from the .ini file.

โš™๏ธ Supported environment variables

Environment Variable Description
MIGROPY_DB_HOST Database host
MIGROPY_DB_PORT Database port
MIGROPY_DB_USER Database user
MIGROPY_DB_PASSWORD Database password
MIGROPY_DB_NAME Database name
MIGROPY_DB_TYPE Database type (e.g., postgres, mysql)
MIGROPY_MIGRATIONS_PATH Path to migration scripts
MIGROPY_BASE_SCHEMA Base schema (Postgres only)
MIGROPY_LOG_LEVEL Logging level (e.g., DEBUG, INFO, WARNING)

4. Create a new migration

This command will create a new migration file in the migropy/versions directory with the following template:

migropy generate 'migration name'
-- Up migration

-- Down migration

5. Apply the migrations

This command will apply all the migrations in the migrations directory. Please note the migrations are applied in the prefix order.

migropy upgrade

6. Downgrade the migrations

This command will downgrade all the migrations in the migrations directory. Please note the migrations are downgraded in the prefix order.

migropy downgrade

7. Rollback the migrations

This command will rollback the last n migrations in the migrations directory, starting from the last one executed.

migropy rollback <n>

๐Ÿ How to use - Python

You can also use Migropy as a library in your Python code. Here is an example of how to use it:

# Importing the function to load the migration configuration
from migropy.configuration_parser import load_config

# Importing the Postgres database adapter
from migropy.databases.postgres import Postgres

# Importing the common database configuration structure
from migropy.databases.commons import DbConfig

# Importing the migration engine responsible for applying migrations
from migropy.migration_engine import MigrationEngine

# Create a database configuration object with connection parameters
db_config = DbConfig(
    host="localhost",  # Database server hostname or IP
    port=5432,  # Default PostgreSQL port
    user="user",  # Username to connect to the database
    password="password",  # Password for the given user
    database="test"  # Name of the target database
)

# Instantiate a Postgres database connection using the provided configuration
db = Postgres(db_config)

# Create a MigrationEngine instance with:
# - the database connection
# - the loaded configuration (usually from a file like migropy.ini)
engine = MigrationEngine(db=db, config=load_config())

# Initialize the migropy environment and create the necessary tables
# use it just once!!!
engine.init()

# Generate a new migration revision with a descriptive name
engine.generate_revision(revision_name='first revision')

# Apply all pending migrations to upgrade the database schema
engine.upgrade()

๐Ÿ“„ Migration example

-- Up migration
CREATE TABLE users
(
    id    SERIAL PRIMARY KEY,
    name  VARCHAR(100) NOT NULL,
    email VARCHAR(100) NOT NULL
);

-- Down migration
DROP TABLE users;

โš™๏ธ Available commands

Comando Descrizione
migropy init <optional_folder_name:str> Init migratron environment
migropy generate <name:str> Generate a new sql migration
migropy upgrade Apply all the migration
migropy downgrade Rollback all revisions
migropy rollback <n:int> Rollback n revisions
migropy list Show current migration status

๐Ÿงช Running Unit Tests

To run the unit tests using poetry, you can use the following command:

poetry run pytest --rootdir=tests

๐Ÿ“ Changelog

See the full CHANGELOG.md

Latest Changes

  • 0.4.0 - Dependencies update, custom migration directory name & env variables support
  • 0.3.1 - Code refactor to improve readability and maintainability
  • 0.3.0 - Add rollback command
  • 0.2.2 โ€“ Commands refactor & usage from python code
  • 0.2.1 โ€“ Increase minimum python version to 3.10 & refactor MigrationEngine
  • 0.2.0 โ€“ MySQL database support
  • 0.1.1 โ€“ Initial project setup with PostgreSQL

๐Ÿค Contributing

We welcome contributions!
To get started:

  1. Fork the repository
  2. Create a new branch (git checkout -b feature/your-feature)
  3. Commit your changes
  4. Open a pull request ๐Ÿš€

๐Ÿ“ซ Support

For issues, feature requests or general questions, open an issue on GitHub Issues.


๐Ÿ“„ License

MIT License ยฉ 2025 โ€” teoxy

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

migropy-0.4.0.tar.gz (13.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

migropy-0.4.0-py3-none-any.whl (15.7 kB view details)

Uploaded Python 3

File details

Details for the file migropy-0.4.0.tar.gz.

File metadata

  • Download URL: migropy-0.4.0.tar.gz
  • Upload date:
  • Size: 13.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.1.3 CPython/3.13.4 Darwin/25.0.0

File hashes

Hashes for migropy-0.4.0.tar.gz
Algorithm Hash digest
SHA256 f163f7933fdb3a633768e48266aa54b22fa02324e1d4eb7bb61ff1dda524bed1
MD5 adfdfdcc3ab03859cfd900528dd3b4d3
BLAKE2b-256 4a3d7365b0aa2c665a359687d3d75e05873b0992d56fa510d5a53e38eedf81c9

See more details on using hashes here.

File details

Details for the file migropy-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: migropy-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 15.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.1.3 CPython/3.13.4 Darwin/25.0.0

File hashes

Hashes for migropy-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 32ff37f8517830576f1e1948150c1c1049b375a1cce66aa86f0a69f393e8e78a
MD5 fab8b5f62c70a036afd4d8d2f3e1f612
BLAKE2b-256 57e52b16b2b5e14f6bb2b433c8f77d40c290113ace04a52b79df8ab86caeb778

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page