From 8e666b4704203cfc058a247361a4045ea79b6e6e Mon Sep 17 00:00:00 2001 From: -LAN- Date: Tue, 2 Sep 2025 23:57:52 +0800 Subject: [PATCH] refactor: remove unused is_deleted field from conversations table Remove the is_deleted field that was never utilized for soft deletion. This simplifies queries and reduces unnecessary database overhead. Fixes #25017 --- api/controllers/console/app/conversation.py | 6 ++-- ...09_remove_unused_is_deleted_field_from_.py | 33 +++++++++++++++++++ api/models/model.py | 2 -- api/services/conversation_service.py | 2 -- .../services/test_web_conversation_service.py | 1 - 5 files changed, 35 insertions(+), 9 deletions(-) create mode 100644 api/migrations/versions/2025_09_02_2012-4f02b6704509_remove_unused_is_deleted_field_from_.py diff --git a/api/controllers/console/app/conversation.py b/api/controllers/console/app/conversation.py index c16dcfd91f..2819e5a054 100644 --- a/api/controllers/console/app/conversation.py +++ b/api/controllers/console/app/conversation.py @@ -338,9 +338,7 @@ class CompletionConversationApi(Resource): current_user, _ = current_account_with_tenant() args = CompletionConversationQuery.model_validate(request.args.to_dict(flat=True)) # type: ignore - query = sa.select(Conversation).where( - Conversation.app_id == app_model.id, Conversation.mode == "completion", Conversation.is_deleted.is_(False) - ) + query = sa.select(Conversation).where(Conversation.app_id == app_model.id, Conversation.mode == "completion") if args.keyword: query = query.join(Message, Message.conversation_id == Conversation.id).where( @@ -452,7 +450,7 @@ class ChatConversationApi(Resource): .subquery() ) - query = sa.select(Conversation).where(Conversation.app_id == app_model.id, Conversation.is_deleted.is_(False)) + query = sa.select(Conversation).where(Conversation.app_id == app_model.id) if args.keyword: keyword_filter = f"%{args.keyword}%" 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 new file mode 100644 index 0000000000..8db951133c --- /dev/null +++ b/api/migrations/versions/2025_09_02_2012-4f02b6704509_remove_unused_is_deleted_field_from_.py @@ -0,0 +1,33 @@ +"""remove unused is_deleted field from conversations + +Revision ID: 4f02b6704509 +Revises: b95962a3885c +Create Date: 2025-09-02 20:12:37.311318 + +""" +from alembic import op +import models as models +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '4f02b6704509' +down_revision = 'b95962a3885c' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('conversations', schema=None) as batch_op: + batch_op.drop_column('is_deleted') + + # ### end Alembic commands ### + + +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)) + + # ### end Alembic commands ### diff --git a/api/models/model.py b/api/models/model.py index 88cb945b3f..d2ae4aabe9 100644 --- a/api/models/model.py +++ b/api/models/model.py @@ -676,8 +676,6 @@ class Conversation(Base): "MessageAnnotation", backref="conversation", lazy="select", passive_deletes="all" ) - is_deleted: Mapped[bool] = mapped_column(sa.Boolean, nullable=False, server_default=sa.text("false")) - @property def inputs(self) -> dict[str, Any]: inputs = self._inputs.copy() diff --git a/api/services/conversation_service.py b/api/services/conversation_service.py index 5253199552..10a68f187f 100644 --- a/api/services/conversation_service.py +++ b/api/services/conversation_service.py @@ -47,7 +47,6 @@ class ConversationService: return InfiniteScrollPagination(data=[], limit=limit, has_more=False) stmt = select(Conversation).where( - Conversation.is_deleted == False, Conversation.app_id == app_model.id, Conversation.from_source == ("api" if isinstance(user, EndUser) else "console"), Conversation.from_end_user_id == (user.id if isinstance(user, EndUser) else None), @@ -166,7 +165,6 @@ class ConversationService: Conversation.from_source == ("api" if isinstance(user, EndUser) else "console"), Conversation.from_end_user_id == (user.id if isinstance(user, EndUser) else None), Conversation.from_account_id == (user.id if isinstance(user, Account) else None), - Conversation.is_deleted == False, ) .first() ) diff --git a/api/tests/test_containers_integration_tests/services/test_web_conversation_service.py b/api/tests/test_containers_integration_tests/services/test_web_conversation_service.py index bbbf48ede9..6207761f56 100644 --- a/api/tests/test_containers_integration_tests/services/test_web_conversation_service.py +++ b/api/tests/test_containers_integration_tests/services/test_web_conversation_service.py @@ -149,7 +149,6 @@ class TestWebConversationService: from_end_user_id=user.id if isinstance(user, EndUser) else None, from_account_id=user.id if isinstance(user, Account) else None, dialogue_count=0, - is_deleted=False, ) from extensions.ext_database import db