🔥 Remove commit artifact
This commit is contained in:
parent
e2669853ae
commit
2e83e65c7e
1 changed files with 0 additions and 90 deletions
|
|
@ -1,90 +0,0 @@
|
|||
import asyncio
|
||||
from pathlib import Path
|
||||
from aerich import Command
|
||||
from ohmyapi.core import runtime
|
||||
|
||||
|
||||
class MigrationManager:
|
||||
def __init__(self, project):
|
||||
self.project = project
|
||||
self._commands = {}
|
||||
# Compute tortoise_config grouped by app module
|
||||
self._tortoise_config = self._build_tortoise_config()
|
||||
|
||||
def _build_tortoise_config(self) -> dict:
|
||||
"""
|
||||
Build Tortoise config from the flat model_registry,
|
||||
grouping models by app module for Aerich compatibility.
|
||||
"""
|
||||
db_url = self.project.settings.DATABASE_URL
|
||||
registry = self.project.model_registry # flat: model_path -> class
|
||||
|
||||
apps_modules = {}
|
||||
for model_path, model_cls in registry.items():
|
||||
if not isinstance(model_cls, type):
|
||||
raise TypeError(f"Registry value must be a class, got {type(model_cls)}: {model_cls}")
|
||||
# Extract app module by removing the model class name
|
||||
# Example: 'ohmyapi.apps.auth.User' -> 'ohmyapi.apps.auth'
|
||||
app_module = ".".join(model_path.split(".")[:-1])
|
||||
apps_modules.setdefault(app_module, []).append(model_cls)
|
||||
|
||||
# Build Tortoise config
|
||||
apps_config = {}
|
||||
for app_module, models in apps_modules.items():
|
||||
modules_set = set(m.__module__ for m in models)
|
||||
apps_config[app_module] = {
|
||||
"models": list(modules_set),
|
||||
"default_connection": "default",
|
||||
}
|
||||
|
||||
return {
|
||||
"connections": {"default": db_url},
|
||||
"apps": apps_config,
|
||||
}
|
||||
|
||||
def get_apps(self):
|
||||
"""Return app modules extracted from the registry"""
|
||||
return list(self._tortoise_config["apps"].keys())
|
||||
|
||||
def get_migration_location(self, app_module: str) -> str:
|
||||
"""Return the path to the app's migrations folder"""
|
||||
try:
|
||||
module = __import__(app_module, fromlist=["migrations"])
|
||||
if not hasattr(module, "__file__") or module.__file__ is None:
|
||||
raise ValueError(f"Cannot determine filesystem path for app '{app_module}'")
|
||||
app_path = Path(module.__file__).parent
|
||||
migrations_path = app_path / "migrations"
|
||||
migrations_path.mkdir(exist_ok=True)
|
||||
return str(migrations_path)
|
||||
except ModuleNotFoundError:
|
||||
raise ValueError(f"App module '{app_module}' cannot be imported")
|
||||
|
||||
async def init_app_command(self, app_module: str) -> Command:
|
||||
"""Initialize Aerich command for a specific app module"""
|
||||
location = self.get_migration_location(app_module)
|
||||
cmd = Command(
|
||||
tortoise_config=self._tortoise_config,
|
||||
app=app_module,
|
||||
location=location,
|
||||
)
|
||||
await cmd.init()
|
||||
self._commands[app_module] = cmd
|
||||
return cmd
|
||||
|
||||
async def makemigrations(self, app_module: str):
|
||||
"""Generate migrations for a specific app"""
|
||||
cmd = self._commands.get(app_module) or await self.init_app_command(app_module)
|
||||
await cmd.migrate()
|
||||
|
||||
async def migrate(self, app_module: str = None):
|
||||
"""Apply migrations. If app_module is None, migrate all apps"""
|
||||
apps_to_migrate = [app_module] if app_module else self.get_apps()
|
||||
for app in apps_to_migrate:
|
||||
cmd = self._commands.get(app) or await self.init_app_command(app)
|
||||
await cmd.upgrade()
|
||||
|
||||
async def show_migrations(self, app_module: str):
|
||||
"""List migrations for an app"""
|
||||
cmd = self._commands.get(app_module) or await self.init_app_command(app_module)
|
||||
await cmd.history()
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue