You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
orquestrador/admin_app/db/bootstrap.py

61 lines
2.4 KiB
Python

"""
Rotina dedicada de bootstrap do banco administrativo.
Cria tabelas do dominio administrativo de forma explicita, fora do startup do app.
"""
from sqlalchemy import inspect, text
from admin_app.db.database import AdminBase, admin_engine
from admin_app.db.models import AuditLog, StaffAccount, StaffSession, ToolArtifact, ToolDraft, ToolMetadata, ToolVersion
_REGISTERED_MODELS = (AuditLog, StaffAccount, StaffSession, ToolArtifact, ToolDraft, ToolMetadata, ToolVersion)
def _ensure_admin_schema_evolution() -> None:
inspector = inspect(admin_engine)
table_names = set(inspector.get_table_names())
if "tool_drafts" in table_names:
tool_draft_columns = {column["name"] for column in inspector.get_columns("tool_drafts")}
statements: list[str] = []
if "current_version_number" not in tool_draft_columns:
statements.append("ALTER TABLE tool_drafts ADD COLUMN current_version_number INT NOT NULL DEFAULT 1")
if "version_count" not in tool_draft_columns:
statements.append("ALTER TABLE tool_drafts ADD COLUMN version_count INT NOT NULL DEFAULT 1")
if "generation_model" not in tool_draft_columns:
statements.append("ALTER TABLE tool_drafts ADD COLUMN generation_model VARCHAR(120)")
if statements:
with admin_engine.begin() as connection:
for statement in statements:
connection.execute(text(statement))
if "tool_versions" in table_names:
tool_version_columns = {column["name"] for column in inspector.get_columns("tool_versions")}
statements = []
if "generation_model" not in tool_version_columns:
statements.append("ALTER TABLE tool_versions ADD COLUMN generation_model VARCHAR(120)")
if statements:
with admin_engine.begin() as connection:
for statement in statements:
connection.execute(text(statement))
def bootstrap_admin_database() -> None:
"""Cria o schema administrativo sem executar seed implicita."""
print("Inicializando schema administrativo...")
try:
AdminBase.metadata.create_all(bind=admin_engine)
_ensure_admin_schema_evolution()
except Exception as exc:
raise RuntimeError(f"Falha ao inicializar banco administrativo: {exc}") from exc
print("Schema administrativo inicializado com sucesso!")
def main() -> None:
bootstrap_admin_database()
if __name__ == "__main__":
main()