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 discover

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

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

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
pip install -e ".[dev]"

# Run tests
pytest

# Format and lint code
ruff check --fix .
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.0.0.tar.gz (129.9 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.0.0-py3-none-any.whl (10.7 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: alembic_autoscan-1.0.0.tar.gz
  • Upload date:
  • Size: 129.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.13 {"installer":{"name":"uv","version":"0.9.13"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for alembic_autoscan-1.0.0.tar.gz
Algorithm Hash digest
SHA256 e9df47b4830801d11a014fb1fb065c575e8fbbe937fb7d887cb5ba61ec3f22c3
MD5 491c80abf3880b9e3e53016133830447
BLAKE2b-256 f2d8d5ff5e7e63d8fc2746debb992c343e0e25a4ef626dd90ac3c9900eb95deb

See more details on using hashes here.

File details

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

File metadata

  • Download URL: alembic_autoscan-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 10.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.13 {"installer":{"name":"uv","version":"0.9.13"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for alembic_autoscan-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 73f5c66e4250306e3bfb4f372e9c24d1e36d300be3cadaaa75060ab3bfac10a0
MD5 a68a2a9e17450e1e1f69edba6d79c290
BLAKE2b-256 67a88cd2e2e32c373a2db68c6bc6502142af69dd353ef02af1c8c03400da7d13

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