P0-fix: plugin migrations use migration engine (crm_migration) instead of API engine (crm_api)
Check Cross-Plugin Imports / check (push) Has been cancelled
Check Cross-Plugin Imports / check (push) Has been cancelled
- main.py: registry.initialize(get_migration_engine()) instead of get_engine() - main.py: plugin migrations run via get_migration_session_factory() not async_session() - registry.py: upgrade_plugin, install_plugin, uninstall_plugin all use migration session for DDL - db/__init__.py: get_migration_engine() raises RuntimeError if MIGRATION_DATABASE_URL missing (no fallback) - Fixes fresh-install failure: crm_api has no DDL rights, plugin migrations need crm_migration
This commit is contained in:
+13
-3
@@ -160,13 +160,23 @@ def get_worker_session_factory() -> async_sessionmaker[AsyncSession]:
|
||||
def get_migration_engine() -> AsyncEngine:
|
||||
"""Get or create the migration engine (crm_migration role).
|
||||
|
||||
Used by Alembic for DDL operations. This engine connects as the table owner.
|
||||
Falls back to the main engine if MIGRATION_DATABASE_URL is not set.
|
||||
Used by Alembic and plugin migrations for DDL operations.
|
||||
This engine connects as the table owner with BYPASSRLS.
|
||||
|
||||
Raises:
|
||||
RuntimeError: If MIGRATION_DATABASE_URL is not set.
|
||||
"""
|
||||
global _migration_engine
|
||||
if _migration_engine is None:
|
||||
settings = get_settings()
|
||||
url = settings.migration_database_url or settings.database_url
|
||||
url = settings.migration_database_url
|
||||
if not url:
|
||||
raise RuntimeError(
|
||||
"MIGRATION_DATABASE_URL is not set. "
|
||||
"Plugin migrations and Alembic require a dedicated migration "
|
||||
"database connection (crm_migration role). "
|
||||
"The application cannot start without it."
|
||||
)
|
||||
_migration_engine = create_async_engine(
|
||||
url,
|
||||
pool_size=2,
|
||||
|
||||
Reference in New Issue
Block a user