From d3490ebb0ff865dd4c185ef80adcf074b3f61d0e Mon Sep 17 00:00:00 2001 From: -LAN- Date: Wed, 3 Sep 2025 10:18:59 +0800 Subject: [PATCH] refactor: backup soft-deleted conversations instead of deleting them - Create backup table conversations_4f02b6704509_bak for soft-deleted records - Only create backup table if soft-deleted records exist - Support recovery during downgrade migration - Drop backup table after successful restoration --- ...09_remove_unused_is_deleted_field_from_.py | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/api/migrations/versions/2025_09_02_2012-4f02b6704509_remove_unused_is_deleted_field_from_.py b/api/migrations/versions/2025_09_02_2012-4f02b6704509_remove_unused_is_deleted_field_from_.py index 6da8dfae6c..d0fd8c9125 100644 --- a/api/migrations/versions/2025_09_02_2012-4f02b6704509_remove_unused_is_deleted_field_from_.py +++ b/api/migrations/versions/2025_09_02_2012-4f02b6704509_remove_unused_is_deleted_field_from_.py @@ -19,7 +19,21 @@ depends_on = None def upgrade(): # ### commands auto generated by Alembic - please adjust! ### - # Delete any conversations where is_deleted is true before dropping the column + # Create backup table for soft-deleted conversations + backup_table_name = 'conversations_4f02b6704509_bak' + + # Check if there are any soft-deleted conversations + result = op.get_bind().execute(sa.text("SELECT COUNT(*) FROM conversations WHERE is_deleted = true")) + count = result.scalar() + + if count > 0: + # Create backup table with all columns from conversations + op.execute(sa.text(f""" + CREATE TABLE {backup_table_name} AS + SELECT * FROM conversations WHERE is_deleted = true + """)) + + # Delete soft-deleted conversations from main table op.execute("DELETE FROM conversations WHERE is_deleted = true") with op.batch_alter_table('conversations', schema=None) as batch_op: @@ -32,5 +46,26 @@ def downgrade(): # ### commands auto generated by Alembic - please adjust! ### with op.batch_alter_table('conversations', schema=None) as batch_op: batch_op.add_column(sa.Column('is_deleted', sa.BOOLEAN(), server_default=sa.text('false'), autoincrement=False, nullable=False)) + + # Restore soft-deleted conversations from backup table if it exists + backup_table_name = 'conversations_4f02b6704509_bak' + + # Check if backup table exists + result = op.get_bind().execute(sa.text(f""" + SELECT EXISTS ( + SELECT FROM information_schema.tables + WHERE table_name = '{backup_table_name}' + ) + """)) + + if result.scalar(): + # Restore the soft-deleted conversations + op.execute(sa.text(f""" + INSERT INTO conversations + SELECT * FROM {backup_table_name} + """)) + + # Drop the backup table after restoration + op.execute(sa.text(f"DROP TABLE {backup_table_name}")) # ### end Alembic commands ###