这是一个非常危险的操作,请谨慎操作,删除后的数据不可恢复。
删除整个集合,包含:所有向量、文档、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) 函数只删掉仓库里几件货物,仓库本身还在。