fix:修复项目删除未完全清理关联数据问题(职业、伏笔、分析任务等)

This commit is contained in:
xiamuceer-j
2026-02-12 12:40:22 +08:00
parent 76cf695c85
commit 84a07dbf3e
+54 -2
View File
@@ -14,6 +14,10 @@ from app.models.chapter import Chapter
from app.models.generation_history import GenerationHistory from app.models.generation_history import GenerationHistory
from app.models.relationship import CharacterRelationship, Organization, OrganizationMember from app.models.relationship import CharacterRelationship, Organization, OrganizationMember
from app.models.memory import StoryMemory, PlotAnalysis from app.models.memory import StoryMemory, PlotAnalysis
from app.models.foreshadow import Foreshadow
from app.models.career import Career, CharacterCareer
from app.models.analysis_task import AnalysisTask
from app.models.batch_generation_task import BatchGenerationTask
from app.schemas.project import ( from app.schemas.project import (
ProjectCreate, ProjectCreate,
ProjectUpdate, ProjectUpdate,
@@ -234,11 +238,15 @@ async def delete_project(
else: else:
logger.warning(f"⚠️ 未找到用户ID,跳过向量数据库清理") logger.warning(f"⚠️ 未找到用户ID,跳过向量数据库清理")
# === 删除所有关联数据(SQLite默认不启用外键约束,需要显式删除)===
# 1. 删除角色关系
relationships_result = await db.execute( relationships_result = await db.execute(
delete(CharacterRelationship).where(CharacterRelationship.project_id == project_id) delete(CharacterRelationship).where(CharacterRelationship.project_id == project_id)
) )
logger.debug(f"删除角色关系数: {relationships_result.rowcount}") logger.debug(f"删除角色关系数: {relationships_result.rowcount}")
# 2. 删除组织成员和组织
orgs_result = await db.execute( orgs_result = await db.execute(
select(Organization).where(Organization.project_id == project_id) select(Organization).where(Organization.project_id == project_id)
) )
@@ -256,29 +264,73 @@ async def delete_project(
) )
logger.debug(f"删除组织数: {organizations_result.rowcount}") logger.debug(f"删除组织数: {organizations_result.rowcount}")
# 3. 删除生成历史
history_result = await db.execute( history_result = await db.execute(
delete(GenerationHistory).where(GenerationHistory.project_id == project_id) delete(GenerationHistory).where(GenerationHistory.project_id == project_id)
) )
logger.debug(f"删除生成历史数: {history_result.rowcount}") logger.debug(f"删除生成历史数: {history_result.rowcount}")
# 4. 删除分析任务
analysis_tasks_result = await db.execute(
delete(AnalysisTask).where(AnalysisTask.project_id == project_id)
)
logger.debug(f"删除分析任务数: {analysis_tasks_result.rowcount}")
# 5. 删除批量生成任务
batch_tasks_result = await db.execute(
delete(BatchGenerationTask).where(BatchGenerationTask.project_id == project_id)
)
logger.debug(f"删除批量生成任务数: {batch_tasks_result.rowcount}")
# 6. 删除角色职业关联(先获取角色ID列表)
characters_query = await db.execute(
select(Character.id).where(Character.project_id == project_id)
)
character_ids = [row[0] for row in characters_query.fetchall()]
if character_ids:
character_careers_result = await db.execute(
delete(CharacterCareer).where(CharacterCareer.character_id.in_(character_ids))
)
logger.debug(f"删除角色职业关联数: {character_careers_result.rowcount}")
# 7. 删除职业体系
careers_result = await db.execute(
delete(Career).where(Career.project_id == project_id)
)
logger.debug(f"删除职业体系数: {careers_result.rowcount}")
# 8. 删除故事记忆
story_memories_result = await db.execute(
delete(StoryMemory).where(StoryMemory.project_id == project_id)
)
logger.debug(f"删除故事记忆数: {story_memories_result.rowcount}")
# 9. 删除章节(会级联删除 PlotAnalysis
chapters_result = await db.execute( chapters_result = await db.execute(
delete(Chapter).where(Chapter.project_id == project_id) delete(Chapter).where(Chapter.project_id == project_id)
) )
logger.debug(f"删除章节数: {chapters_result.rowcount}") logger.debug(f"删除章节数: {chapters_result.rowcount}")
# 10. 删除大纲
outlines_result = await db.execute( outlines_result = await db.execute(
delete(Outline).where(Outline.project_id == project_id) delete(Outline).where(Outline.project_id == project_id)
) )
logger.debug(f"删除大纲数: {outlines_result.rowcount}") logger.debug(f"删除大纲数: {outlines_result.rowcount}")
# 11. 删除角色
characters_result = await db.execute( characters_result = await db.execute(
delete(Character).where(Character.project_id == project_id) delete(Character).where(Character.project_id == project_id)
) )
logger.debug(f"删除角色数: {characters_result.rowcount}") logger.debug(f"删除角色数: {characters_result.rowcount}")
# 注意:StoryMemory和PlotAnalysis会通过数据库级联删除自动清理 # 12. 删除伏笔
# 但向量数据库已在上面手动清理 foreshadows_result = await db.execute(
delete(Foreshadow).where(Foreshadow.project_id == project_id)
)
logger.debug(f"删除伏笔数: {foreshadows_result.rowcount}")
# 最后删除项目本身
await db.delete(project) await db.delete(project)
await db.commit() await db.commit()