From 20161094fc45dc2b31cc914f87259c42a3485c6a Mon Sep 17 00:00:00 2001 From: "russell@unturf.com" Date: Sat, 7 Feb 2026 18:22:54 -0500 Subject: [PATCH] Make rb_sudo_otp migration idempotent to fix deploy. init_db creates the table via metadata, so alembic upgrade must check for its existence before issuing CREATE TABLE. --- .../7c624a8fae9e_create_rb_sudo_otp_table.py | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/remarkbox/scripts/alembic/versions/7c624a8fae9e_create_rb_sudo_otp_table.py b/remarkbox/scripts/alembic/versions/7c624a8fae9e_create_rb_sudo_otp_table.py index 0fe8872..0ad5e28 100644 --- a/remarkbox/scripts/alembic/versions/7c624a8fae9e_create_rb_sudo_otp_table.py +++ b/remarkbox/scripts/alembic/versions/7c624a8fae9e_create_rb_sudo_otp_table.py @@ -17,15 +17,18 @@ import sqlalchemy as sa def upgrade(): - op.create_table('rb_sudo_otp', - sa.Column('action_key', sa.Unicode(length=256), nullable=False), - sa.Column('code', sa.Unicode(length=8), nullable=False), - sa.Column('action', sa.Unicode(length=512), nullable=False), - sa.Column('client_ip', sa.Unicode(length=45), nullable=True), - sa.Column('created_at', sa.BigInteger(), nullable=False), - sa.Column('expires_at', sa.BigInteger(), nullable=False), - sa.PrimaryKeyConstraint('action_key'), - ) + conn = op.get_bind() + inspector = sa.inspect(conn) + if 'rb_sudo_otp' not in inspector.get_table_names(): + op.create_table('rb_sudo_otp', + sa.Column('action_key', sa.Unicode(length=256), nullable=False), + sa.Column('code', sa.Unicode(length=8), nullable=False), + sa.Column('action', sa.Unicode(length=512), nullable=False), + sa.Column('client_ip', sa.Unicode(length=45), nullable=True), + sa.Column('created_at', sa.BigInteger(), nullable=False), + sa.Column('expires_at', sa.BigInteger(), nullable=False), + sa.PrimaryKeyConstraint('action_key'), + ) def downgrade():