From 68ffa6b7eb138f49a09cc268740e6165debcd933 Mon Sep 17 00:00:00 2001 From: hailin Date: Fri, 6 Feb 2026 22:25:31 -0800 Subject: [PATCH] fix(database): add DELETED to conversations status CHECK constraint MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 用户删除历史对话时报错 conversations_status_check 违反约束, 因为 softDelete() 设置 status='DELETED' 但数据库 CHECK 约束 只允许 ACTIVE/ENDED/ARCHIVED。 修复: - 新增 migration 修改 CHECK 约束,添加 DELETED 值 - 同步更新 init.sql 以支持全新部署 生产环境需执行: database/migrations/20260207_add_deleted_status_to_conversations.sql Co-Authored-By: Claude Opus 4.6 --- .../20260207_add_deleted_status_to_conversations.sql | 10 ++++++++++ infrastructure/docker/services/postgres/init.sql | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 database/migrations/20260207_add_deleted_status_to_conversations.sql diff --git a/database/migrations/20260207_add_deleted_status_to_conversations.sql b/database/migrations/20260207_add_deleted_status_to_conversations.sql new file mode 100644 index 0000000..3f32fa0 --- /dev/null +++ b/database/migrations/20260207_add_deleted_status_to_conversations.sql @@ -0,0 +1,10 @@ +-- Migration: Add 'DELETED' to conversations status CHECK constraint +-- 修复:软删除功能需要 DELETED 状态,但数据库 CHECK 约束未包含该值 +-- 导致用户无法删除历史对话(QueryFailedError: conversations_status_check) + +-- 删除旧约束 +ALTER TABLE conversations DROP CONSTRAINT IF EXISTS conversations_status_check; + +-- 添加包含 DELETED 的新约束 +ALTER TABLE conversations ADD CONSTRAINT conversations_status_check + CHECK (status IN ('ACTIVE', 'ENDED', 'ARCHIVED', 'DELETED')); diff --git a/infrastructure/docker/services/postgres/init.sql b/infrastructure/docker/services/postgres/init.sql index c5c4ce1..cf7f7d8 100644 --- a/infrastructure/docker/services/postgres/init.sql +++ b/infrastructure/docker/services/postgres/init.sql @@ -62,9 +62,9 @@ CREATE TABLE conversations ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), -- 所属用户ID user_id UUID REFERENCES users(id) ON DELETE CASCADE, - -- 对话状态: ACTIVE(进行中), ENDED(已结束), ARCHIVED(已归档) + -- 对话状态: ACTIVE(进行中), ENDED(已结束), ARCHIVED(已归档), DELETED(软删除) status VARCHAR(20) NOT NULL DEFAULT 'ACTIVE' - CHECK (status IN ('ACTIVE', 'ENDED', 'ARCHIVED')), + CHECK (status IN ('ACTIVE', 'ENDED', 'ARCHIVED', 'DELETED')), -- 对话标题(自动生成或用户设置) title VARCHAR(255), -- 对话摘要(AI生成)