Skip to main content

next‑generation database migration tool

Project description

schemactl

framework‑agnostic database schema evolution tool for Python

schemactl is a next‑generation database migration tool built on top of SQLAlchemy metadata and Alembic autogeneration.

Unlike traditional migration tools, schemactl is designed as a schema evolution engine, not just a migration runner. It is architecture‑first, deterministic, and ready to integrate with LLMs, agents, and autonomous workflows.


Why schemactl?

Most migration tools are:

  • framework‑coupled
  • imperative and manual
  • hard to reason about at scale
  • unfriendly to AI‑assisted workflows

schemactl takes a different approach:

  • Framework‑agnostic – works with pure SQLAlchemy
  • Metadata‑driven – schema is the single source of truth
  • Diff‑based – migrations are generated from real schema changes
  • Deterministic – reproducible and auditable
  • AI‑ready – designed for LLM review, risk analysis, and human‑in‑the‑loop control

Core Concepts

Schema as Code

Your SQLAlchemy models (metadata) define the desired state of the database. For example, in app/models.py:

from sqlalchemy import Column, Integer, String, DateTime, Boolean
from sqlalchemy.orm import declarative_base
from datetime import datetime

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    
    id = Column(Integer, primary_key=True)
    email = Column(String(255), unique=True, nullable=False)
    username = Column(String(100), unique=True, nullable=False)
    created_at = Column(DateTime, default=datetime.utcnow)
    is_active = Column(Boolean, default=True)

schemactl compares this metadata against the actual database schema and generates migrations automatically.


Evolution, Not Just Migration

Instead of thinking in terms of "apply SQL files", schemactl models:

  • schema diffs
  • schema versions
  • schema state

This enables future features like:

  • automated rollback planning
  • migration safety scoring
  • AI‑assisted reviews
  • policy enforcement

Installation

pip install schemactl

CLI Overview

schemactl --help

Planned commands:

schemactl new       # generate a new migration from metadata diff
schemactl up        # create DB (if needed) and apply pending migrations
schemactl create    # create the database
schemactl drop      # drop the database
schemactl migrate   # run pending migrations
schemactl rollback  # rollback the last migration
schemactl down      # alias for rollback
schemactl status    # show migration status
#schemactl dump      # dump schema.sql
#schemactl load      # load schema.sql
schemactl wait      # wait for DB readiness

Usage

1. Generate a Migration

To generate an empty migration file:

schemactl new --message add_users_table

To auto-generate a migration based on model changes, use the --auto flag and specify the path to your models:

schemactl new \
  --message create_initial_tables \
  --auto \
  --models app.models

The command generates a new migration file:

migrations/
└── 20251215_create_initial_tables.sql

The content of the generated file will look like this:

-- migrate:up
-- Auto-generated migration: create_initial_tables
CREATE TABLE users (
    id SERIAL NOT NULL,
    email VARCHAR(255) NOT NULL,
    username VARCHAR(100) NOT NULL,
    created_at TIMESTAMP WITHOUT TIME ZONE,
    is_active BOOLEAN,
    PRIMARY KEY (id),
    UNIQUE (email),
    UNIQUE (username)
);

-- migrate:down
-- Rollback: create_initial_tables
DROP TABLE users;

2. Apply Migrations

schemactl up

What happens:

  • Creates the database if it does not exist
  • Ensures the schema_migrations table exists
  • Applies all pending migrations in order
  • Records applied revisions deterministically

Project Structure

.
├── schemactl/              # Main package source
│   ├── cli.py              # CLI commands
│   ├── services/           # Business logic and services
│   │   └── migration.py
│   │   └── model_loader.py
│   ├── adapters/           # Database and Alembic adapters
│   │   ├── alembic.py
│   │   └── database.py
├── migrations/             # Generated migration files
├── tests/                  # Unit and integration tests
├── pyproject.toml          # Project configuration (Poetry)
└── poetry.lock             # Poetry lock file

This structure follows Clean Architecture and keeps infrastructure concerns isolated.


Design Principles

  • Architecture first, code second
  • Prefer declarative over imperative
  • Explicit state tracking
  • Simple core, extensible edges

Status

⚠️ Early development / experimental

APIs may change. Migration format is not yet stable.


License

MIT


Contributing

Contributions are welcome, especially in:

  • migration safety
  • rollback logic
  • Async / cloud databases

Design discussions > code dumps.

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

schemactl-0.2.1.tar.gz (18.2 kB view details)

Uploaded Source

Built Distribution

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

schemactl-0.2.1-py3-none-any.whl (19.9 kB view details)

Uploaded Python 3

File details

Details for the file schemactl-0.2.1.tar.gz.

File metadata

  • Download URL: schemactl-0.2.1.tar.gz
  • Upload date:
  • Size: 18.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.2

File hashes

Hashes for schemactl-0.2.1.tar.gz
Algorithm Hash digest
SHA256 9577aec627269ddaf2c9b61f3e0122f8db792fcaa55996080ffe8ade4aa1f921
MD5 e89310adaa05c45af96d359593424dcd
BLAKE2b-256 2f3884d94a62c47eea64b97f7538ec89245c6639c451f4803b82d629a19cd290

See more details on using hashes here.

File details

Details for the file schemactl-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: schemactl-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 19.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.2

File hashes

Hashes for schemactl-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 ae7b69f72ce9b3df41c84e7b1d41558b0cb6a4fed82b692a91159c1af4067194
MD5 7f50d0c6603abecbe764ae5ef62356ee
BLAKE2b-256 ca6c4f31a141f7f6f4a3c65ac356cb0698209fbfe19b18c5eb42a2f8caa778f4

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