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.0.tar.gz (41.5 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.0-py3-none-any.whl (17.3 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: alembic_autoscan-1.2.0.tar.gz
  • Upload date:
  • Size: 41.5 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.0.tar.gz
Algorithm Hash digest
SHA256 27be9b03cc87c2f1d01b7cb6f6186fcdaecd8b92b679d621c396a1e49b6b77b3
MD5 7334c44dc9fe5756ce6ecb039cca949d
BLAKE2b-256 aa586473ae25a602356b93aedf797e66a081ce640baff5f8ff32d33d0cf511cc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for alembic_autoscan-1.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1a0a3ef1028cf66326dee93afc6093e71e5a758899227b03540253ee7def1b6c
MD5 ab5e08d6cf94502bbe1b51e0652d00ff
BLAKE2b-256 4386136fcccc2ce43fa33560bcd0119fb0b5e98b3a90892784ab25f071c52ec1

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