Skip to main content

Automatically discover and import SQLAlchemy models for Alembic migrations

Project description

Alembic Autoscan

🚀 Automatically discover and import SQLAlchemy models for Alembic migrations

Stop manually maintaining model imports in your Alembic env.py file! This library automatically scans your codebase for SQLAlchemy models and imports them for you.

Features

  • 🔍 Automatic Discovery: Scans your project for SQLAlchemy model classes
  • 🛡️ Safe AST Parsing: Uses Abstract Syntax Tree parsing - no code execution required
  • ⚙️ Configurable: Include/exclude patterns for fine-grained control
  • 🎯 Zero Configuration: Works out of the box with sensible defaults
  • 🔌 Easy Integration: Drop-in replacement for manual imports in env.py

Installation

pip install alembic-autoscan

CLI Usage

You can test model discovery from the command line:

# Scan the current directory
alembic-autoscan scan

# Scan a specific directory
alembic-autoscan scan ./app

# Scan with include/exclude patterns
alembic-autoscan scan ./app --include "**/models/**" --exclude "**/tests/**"

[!NOTE] The scan command replaces the older discover and check commands. The check command is deprecated and will be removed in a future version.

Quick Start

Basic Usage

In your Alembic env.py file, replace manual model imports with:

from alembic_autoscan import import_models

# Automatically discover and import all models
import_models()

# Now your target_metadata will include all discovered models
from your_app.database import Base
target_metadata = Base.metadata

Advanced Usage

from alembic_autoscan import import_models

# Customize the discovery process
import_models(
    base_path="./src",                    # Start scanning from this directory
    include_patterns=["**/models/**"],    # Only scan these paths
    exclude_patterns=["**/tests/**"],     # Skip these paths
)

Manual Scanner Usage

For more control, use the ModelScanner directly:

from alembic_autoscan import ModelScanner

scanner = ModelScanner(
    base_path="./app",
    include_patterns=["**/models/**"],
    exclude_patterns=["**/tests/**", "**/migrations/**"]
)

# Get list of discovered model modules
models = scanner.discover()
print(f"Found {len(models)} model modules")

# Import them
scanner.import_models()

How It Works

  1. Scans your Python files using AST (Abstract Syntax Tree) parsing
  2. Identifies classes that inherit from SQLAlchemy's DeclarativeBase or use declarative_base()
  3. Imports the discovered model modules automatically
  4. Registers them with SQLAlchemy's metadata for Alembic to use

Configuration Options

Parameter Type Default Description
base_path str "." Root directory to start scanning
include_patterns List[str] ["**/*.py"] Glob patterns for files to include
exclude_patterns List[str] ["**/venv/**", "**/env/**", ...] Glob patterns for files to exclude

Common Patterns

Django-style Models Directory

import_models(
    base_path="./myapp",
    include_patterns=["**/models.py", "**/models/**/*.py"]
)

Multiple App Structure

import_models(
    base_path="./apps",
    include_patterns=["**/models/**"],
    exclude_patterns=["**/tests/**", "**/migrations/**"]
)

Monorepo with Multiple Services

import_models(
    base_path="./services/user-service",
    include_patterns=["**/models/**"]
)

Requirements

  • Python 3.8+
  • SQLAlchemy 1.4+
  • Alembic 1.7+

Development

# Clone the repository
git clone https://github.com/tonlls/alembic-autoscan.git
cd alembic-autoscan

# Install in development mode
uv sync --dev

# Run tests
uv run pytest

# Run performance tests
uv run pytest tests/test_large_scale.py -v -s

# Format and lint code
uv run ruff check --fix .
uv run ruff format .

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

MIT License - see LICENSE file for details.

Troubleshooting

Models not being discovered?

  1. Ensure your models inherit from SQLAlchemy's DeclarativeBase or use declarative_base()
  2. Check that your model files match the include_patterns
  3. Verify files aren't being excluded by exclude_patterns
  4. Enable debug logging to see what's being scanned

Import errors?

Make sure your project is properly installed or the Python path is configured correctly so that model modules can be imported.

Acknowledgments

Inspired by the common frustration of maintaining manual imports in Alembic migrations. Built with ❤️ for the Python community.

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

alembic_autoscan-1.2.1.tar.gz (42.0 kB view details)

Uploaded Source

Built Distribution

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

alembic_autoscan-1.2.1-py3-none-any.whl (17.7 kB view details)

Uploaded Python 3

File details

Details for the file alembic_autoscan-1.2.1.tar.gz.

File metadata

  • Download URL: alembic_autoscan-1.2.1.tar.gz
  • Upload date:
  • Size: 42.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for alembic_autoscan-1.2.1.tar.gz
Algorithm Hash digest
SHA256 36859e7ea110ae9980fb1c26e5be95c34ea61366599c2db83c79222ffd5c79a6
MD5 0fcee998966fed4dfde562504b5e72b6
BLAKE2b-256 297b5c3adf30057199915cac74efcbac9f43681ad8f0a4f799e271a7c7004714

See more details on using hashes here.

File details

Details for the file alembic_autoscan-1.2.1-py3-none-any.whl.

File metadata

File hashes

Hashes for alembic_autoscan-1.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 3034ca1ffcc5a629e018b30721499d2f25f49cd1082b04ba619c110ceaa48a61
MD5 cc3c39afc0bae3dc011ac9a835c44c82
BLAKE2b-256 84b4cf83d7d41d0a6ac3f576d057a30a3d169fdbd891462e83bdf03ba900ecdd

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