fix: add checks for existing tables and indexes before creating them in alembic migrations for idempotency

This commit is contained in:
Anish Sarkar 2026-05-10 22:40:29 +05:30
parent 292b4d70ac
commit 319923fb40
6 changed files with 68 additions and 21 deletions

View file

@ -26,6 +26,10 @@ depends_on: str | Sequence[str] | None = None
def upgrade() -> None:
bind = op.get_bind()
if sa.inspect(bind).has_table("agent_action_log"):
return
op.create_table(
"agent_action_log",
sa.Column("id", sa.Integer(), primary_key=True, index=True),

View file

@ -29,6 +29,21 @@ depends_on: str | Sequence[str] | None = None
def upgrade() -> None:
bind = op.get_bind()
inspector = sa.inspect(bind)
if inspector.has_table("document_revisions") and inspector.has_table(
"folder_revisions"
):
return
if not inspector.has_table("document_revisions"):
_create_document_revisions()
if not inspector.has_table("folder_revisions"):
_create_folder_revisions()
def _create_document_revisions() -> None:
op.create_table(
"document_revisions",
sa.Column("id", sa.Integer(), primary_key=True, index=True),
@ -74,6 +89,8 @@ def upgrade() -> None:
),
)
def _create_folder_revisions() -> None:
op.create_table(
"folder_revisions",
sa.Column("id", sa.Integer(), primary_key=True, index=True),

View file

@ -26,6 +26,10 @@ depends_on: str | Sequence[str] | None = None
def upgrade() -> None:
bind = op.get_bind()
if sa.inspect(bind).has_table("agent_permission_rules"):
return
op.create_table(
"agent_permission_rules",
sa.Column("id", sa.Integer(), primary_key=True, index=True),

View file

@ -50,29 +50,39 @@ depends_on: str | Sequence[str] | None = None
def upgrade() -> None:
op.add_column(
"agent_action_log",
sa.Column("tool_call_id", sa.String(length=64), nullable=True),
)
op.add_column(
"agent_action_log",
sa.Column("chat_turn_id", sa.String(length=64), nullable=True),
)
bind = op.get_bind()
inspector = sa.inspect(bind)
columns = {c["name"] for c in inspector.get_columns("agent_action_log")}
indexes = {i["name"] for i in inspector.get_indexes("agent_action_log")}
op.create_index(
"ix_agent_action_log_tool_call_id",
"agent_action_log",
["tool_call_id"],
)
op.create_index(
"ix_agent_action_log_chat_turn_id",
"agent_action_log",
["chat_turn_id"],
)
if "tool_call_id" not in columns:
op.add_column(
"agent_action_log",
sa.Column("tool_call_id", sa.String(length=64), nullable=True),
)
if "chat_turn_id" not in columns:
op.add_column(
"agent_action_log",
sa.Column("chat_turn_id", sa.String(length=64), nullable=True),
)
op.execute(
"UPDATE agent_action_log SET tool_call_id = turn_id WHERE tool_call_id IS NULL"
)
if "ix_agent_action_log_tool_call_id" not in indexes:
op.create_index(
"ix_agent_action_log_tool_call_id",
"agent_action_log",
["tool_call_id"],
)
if "ix_agent_action_log_chat_turn_id" not in indexes:
op.create_index(
"ix_agent_action_log_chat_turn_id",
"agent_action_log",
["chat_turn_id"],
)
if "turn_id" in columns:
op.execute(
"UPDATE agent_action_log SET tool_call_id = turn_id WHERE tool_call_id IS NULL"
)
def downgrade() -> None:

View file

@ -27,6 +27,8 @@ from __future__ import annotations
from collections.abc import Sequence
import sqlalchemy as sa
from alembic import op
revision: str = "137"
@ -39,6 +41,11 @@ _INDEX_NAME = "ux_agent_action_log_reverse_of"
def upgrade() -> None:
bind = op.get_bind()
indexes = {i["name"] for i in sa.inspect(bind).get_indexes("agent_action_log")}
if _INDEX_NAME in indexes:
return
# Defensively de-dup any pre-existing double-revert rows before
# adding the unique index. Keeps the OLDEST row (smallest id) and
# NULLs out the duplicates' ``reverse_of`` so they survive as audit

View file

@ -53,6 +53,11 @@ TABLE_NAME = "new_chat_messages"
def upgrade() -> None:
bind = op.get_bind()
indexes = {i["name"] for i in sa.inspect(bind).get_indexes(TABLE_NAME)}
if INDEX_NAME in indexes:
return
op.create_index(
INDEX_NAME,
TABLE_NAME,