fix(minio): 添加删除 bucket 功能,优化知识库删除逻辑 #534
This commit is contained in:
parent
df80829bb2
commit
24cbb41f4f
@ -723,12 +723,16 @@ async def delete_document(db_id: str, doc_id: str, current_user: User = Depends(
|
|||||||
await knowledge_base.delete_folder(db_id, doc_id)
|
await knowledge_base.delete_folder(db_id, doc_id)
|
||||||
return {"message": "文件夹删除成功"}
|
return {"message": "文件夹删除成功"}
|
||||||
|
|
||||||
file_name = file_meta_info.get("meta", {}).get("filename")
|
file_name = file_meta_info.get("meta", {}).get("path", "").split("/")[-1]
|
||||||
|
|
||||||
# 尝试从MinIO删除文件,如果失败(例如旧知识库没有MinIO实例),则忽略
|
# 尝试从MinIO删除文件,如果失败(例如旧知识库没有MinIO实例),则忽略
|
||||||
try:
|
try:
|
||||||
minio_client = get_minio_client()
|
minio_client = get_minio_client()
|
||||||
await minio_client.adelete_file(MinIOClient.get_ref_bucket_name(db_id), file_name)
|
await minio_client.adelete_file(MinIOClient.get_ref_bucket_name(db_id), file_name)
|
||||||
|
# 同时删除 parsed bucket 中的 parsed.md 文件
|
||||||
|
await minio_client.adelete_file(
|
||||||
|
minio_client.KB_BUCKETS["parsed"], f"{db_id}/{doc_id}/parsed.md"
|
||||||
|
)
|
||||||
logger.debug(f"成功从MinIO删除文件: {file_name}")
|
logger.debug(f"成功从MinIO删除文件: {file_name}")
|
||||||
except Exception as minio_error:
|
except Exception as minio_error:
|
||||||
logger.warning(f"从MinIO删除文件失败(可能是旧知识库): {minio_error}")
|
logger.warning(f"从MinIO删除文件失败(可能是旧知识库): {minio_error}")
|
||||||
|
|||||||
@ -506,9 +506,9 @@ class KnowledgeBase(ABC):
|
|||||||
minio_client.adelete_objects_by_prefix(minio_client.KB_BUCKETS["parsed"], prefix),
|
minio_client.adelete_objects_by_prefix(minio_client.KB_BUCKETS["parsed"], prefix),
|
||||||
minio_client.adelete_objects_by_prefix(minio_client.KB_BUCKETS["documents"], prefix),
|
minio_client.adelete_objects_by_prefix(minio_client.KB_BUCKETS["documents"], prefix),
|
||||||
minio_client.adelete_objects_by_prefix(minio_client.KB_BUCKETS["images"], prefix),
|
minio_client.adelete_objects_by_prefix(minio_client.KB_BUCKETS["images"], prefix),
|
||||||
# 删除 ref bucket 中的文件(两种命名格式)
|
# 直接删除 ref bucket(两种命名格式)
|
||||||
minio_client.adelete_objects_by_prefix(minio_client.get_ref_bucket_name(db_id), prefix),
|
minio_client.adelete_bucket(minio_client.get_ref_bucket_name(db_id)),
|
||||||
minio_client.adelete_objects_by_prefix(minio_client.get_ref_bucket_name_full(db_id), prefix),
|
minio_client.adelete_bucket(minio_client.get_ref_bucket_name_full(db_id)),
|
||||||
)
|
)
|
||||||
|
|
||||||
# 3. 删除数据库记录
|
# 3. 删除数据库记录
|
||||||
|
|||||||
@ -283,6 +283,29 @@ class MinIOClient:
|
|||||||
await asyncio.to_thread(_delete_objects)
|
await asyncio.to_thread(_delete_objects)
|
||||||
return deleted_count
|
return deleted_count
|
||||||
|
|
||||||
|
async def adelete_bucket(self, bucket_name: str) -> bool:
|
||||||
|
"""
|
||||||
|
删除 bucket(先删除所有对象,再删除 bucket)
|
||||||
|
|
||||||
|
Args:
|
||||||
|
bucket_name: bucket 名称
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
是否成功
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
# 先删除所有对象
|
||||||
|
await self.adelete_objects_by_prefix(bucket_name, "")
|
||||||
|
# 再删除 bucket
|
||||||
|
await asyncio.to_thread(self.client.remove_bucket, bucket_name)
|
||||||
|
logger.info(f"成功删除 bucket: {bucket_name}")
|
||||||
|
return True
|
||||||
|
except S3Error as e:
|
||||||
|
if "NoSuchBucket" in str(e):
|
||||||
|
logger.warning(f"bucket 不存在: {bucket_name}")
|
||||||
|
return False
|
||||||
|
raise StorageError(f"删除 bucket 失败: {e}")
|
||||||
|
|
||||||
def file_exists(self, bucket_name: str, object_name: str) -> bool:
|
def file_exists(self, bucket_name: str, object_name: str) -> bool:
|
||||||
"""检查文件是否存在"""
|
"""检查文件是否存在"""
|
||||||
try:
|
try:
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user