delete_collection 删除集合

🎉摘要:本文详解 ChromaDB 的 delete_collection 方法的危险性与正确使用,提供含数量校验的安全删除代码,防止误删整个集合导致数据不可恢复。同时说明删除不存在的集合报 NotFoundError,以及集合删除后对象失效的行为。

这是一个非常危险的操作,请谨慎操作,删除后的数据不可恢复。

删除整个集合,包含:所有向量、文档、embedding、集合元数据、索引文件。

方法签名如下:

def delete_collection(
    name: str
) -> None:

参数:name,集合名称字符串(不是 UUID)

返回:无返回值

注意:传的是集合名称,不是 Collection 实例。就算集合改过名字,也要传当前生效的集合名。

例如:

import chromadb

client = chromadb.EphemeralClient()

# 创建一个集合
client.get_or_create_collection("notes")

# 删除集合
client.delete_collection("notes")

如果直接像上面这样删除集合,挺危险的,如果集合名称写错了,可能误删除集合。关键是删除了不能恢复,这就是一场灾难。

下面优化一下代码,在删除前先判断集合中数据数量是否等于预期,等于才进行删除。否则抛出异常,代码如下:

import chromadb

client = chromadb.EphemeralClient()

# 创建一个集合
client.get_or_create_collection("notes")

def safe_delete(cli, name, expect_count=None):
    """安全删除集合,如果有数据,则不删"""
    col = cli.get_collection(name)
    n = col.count() # 获取集合中的数据数量
    # 如果集合记录数量和预期数量不一致,则抛出异常
    if expect_count is not None and n != expect_count:
        raise RuntimeError(f"{name} 有 {n} 条数据,跟预期 {expect_count} 不符,不删")
    print(f"准备删除 {name},共 {n} 条")
    cli.delete_collection(name)

if __name__ == "__main__":
    safe_delete(client, "notes", expect_count=0)

# 输出:
# 准备删除 notes,共 0 条

如果你删除一个不存在的集合,会出现 NotFoundError 错误,例如:

import chromadb

client = chromadb.EphemeralClient()

try:
    client.delete_collection("notes")
except Exception as e:
    print("集合不存在,删它就是会报 NotFoundError(删之前先确认存在):", type(e).__name__, e)

# 输出:
# 集合不存在,删它就是会报 NotFoundError(删之前先确认存在): NotFoundError Collection [notes] does not exist

注意,集合删除后,实例对象还在内存,但底层集合已经不存在,后续任何操作都会报错。此时再调用 col.add / col.query / col.count() 都会抛异常,例如:

import chromadb

client = chromadb.EphemeralClient()

# 创建一个集合
col = client.get_or_create_collection("notes")
col.add(
    ids=["q1"],
    documents=[
        "订单付款后多久发货?一般 48 小时内出库",
    ],
    metadatas=[
        {"category": "物流"},
    ],
)
print(f"删除前 notes 集合记录数:{col.count()}")

# 删除集合
client.delete_collection("notes")

# 查看集合记录数
print(f"删除后 notes 集合记录数:{col.count()}")
# chromadb.errors.NotFoundError: Collection [b43becc3-4a9a-45fd-946f-29e55d90714a] does not exist.

如果将集合想象成仓库,那么 delete_collection 函数拆掉整个仓库; 而 col.delete(ids) 函数只删掉仓库里几件货物,仓库本身还在。  

说说我的看法
全部评论()
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号