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
scancommand replaces the olderdiscoverandcheckcommands. Thecheckcommand 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
- Scans your Python files using AST (Abstract Syntax Tree) parsing
- Identifies classes that inherit from SQLAlchemy's
DeclarativeBaseor usedeclarative_base() - Imports the discovered model modules automatically
- 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?
- Ensure your models inherit from SQLAlchemy's
DeclarativeBaseor usedeclarative_base() - Check that your model files match the
include_patterns - Verify files aren't being excluded by
exclude_patterns - 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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
36859e7ea110ae9980fb1c26e5be95c34ea61366599c2db83c79222ffd5c79a6
|
|
| MD5 |
0fcee998966fed4dfde562504b5e72b6
|
|
| BLAKE2b-256 |
297b5c3adf30057199915cac74efcbac9f43681ad8f0a4f799e271a7c7004714
|
File details
Details for the file alembic_autoscan-1.2.1-py3-none-any.whl.
File metadata
- Download URL: alembic_autoscan-1.2.1-py3-none-any.whl
- Upload date:
- Size: 17.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3034ca1ffcc5a629e018b30721499d2f25f49cd1082b04ba619c110ceaa48a61
|
|
| MD5 |
cc3c39afc0bae3dc011ac9a835c44c82
|
|
| BLAKE2b-256 |
84b4cf83d7d41d0a6ac3f576d057a30a3d169fdbd891462e83bdf03ba900ecdd
|