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: def upgrade() -> None:
bind = op.get_bind()
if sa.inspect(bind).has_table("agent_action_log"):
return
op.create_table( op.create_table(
"agent_action_log", "agent_action_log",
sa.Column("id", sa.Integer(), primary_key=True, index=True), 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: 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( op.create_table(
"document_revisions", "document_revisions",
sa.Column("id", sa.Integer(), primary_key=True, index=True), 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( op.create_table(
"folder_revisions", "folder_revisions",
sa.Column("id", sa.Integer(), primary_key=True, index=True), 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: def upgrade() -> None:
bind = op.get_bind()
if sa.inspect(bind).has_table("agent_permission_rules"):
return
op.create_table( op.create_table(
"agent_permission_rules", "agent_permission_rules",
sa.Column("id", sa.Integer(), primary_key=True, index=True), 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: def upgrade() -> None:
op.add_column( bind = op.get_bind()
"agent_action_log", inspector = sa.inspect(bind)
sa.Column("tool_call_id", sa.String(length=64), nullable=True), 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.add_column(
"agent_action_log",
sa.Column("chat_turn_id", sa.String(length=64), nullable=True),
)
op.create_index( if "tool_call_id" not in columns:
"ix_agent_action_log_tool_call_id", op.add_column(
"agent_action_log", "agent_action_log",
["tool_call_id"], sa.Column("tool_call_id", sa.String(length=64), nullable=True),
) )
op.create_index( if "chat_turn_id" not in columns:
"ix_agent_action_log_chat_turn_id", op.add_column(
"agent_action_log", "agent_action_log",
["chat_turn_id"], sa.Column("chat_turn_id", sa.String(length=64), nullable=True),
) )
op.execute( if "ix_agent_action_log_tool_call_id" not in indexes:
"UPDATE agent_action_log SET tool_call_id = turn_id WHERE tool_call_id IS NULL" 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: def downgrade() -> None:

View file

@ -27,6 +27,8 @@ from __future__ import annotations
from collections.abc import Sequence from collections.abc import Sequence
import sqlalchemy as sa
from alembic import op from alembic import op
revision: str = "137" revision: str = "137"
@ -39,6 +41,11 @@ _INDEX_NAME = "ux_agent_action_log_reverse_of"
def upgrade() -> None: 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 # Defensively de-dup any pre-existing double-revert rows before
# adding the unique index. Keeps the OLDEST row (smallest id) and # adding the unique index. Keeps the OLDEST row (smallest id) and
# NULLs out the duplicates' ``reverse_of`` so they survive as audit # 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: 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( op.create_index(
INDEX_NAME, INDEX_NAME,
TABLE_NAME, TABLE_NAME,