在“Chroma 四层结构”章节介绍了 Chroma 的数据组织是四层:
Tenant(租户)
└── Database(数据库)
└── Collection(集合)
└── Record(记录)默认所有东西都在 default_tenant / default_database 里。
如果想隔离数据,可以创建 AdminClient 客户端,使用该客户端去创建租户,以及在租户下面创建数据库。如下:
import chromadb
from chromadb import Settings
from chromadb.errors import ChromaError
settings = Settings(
chroma_api_impl="chromadb.api.fastapi.FastAPI",
chroma_server_host="localhost",
chroma_server_http_port=8000,
)
admin = chromadb.AdminClient(settings=settings)
def ensure_tenant(tenant_name: str):
"""确保租户存在,存在则跳过"""
try:
admin.create_tenant(tenant_name)
print(f"✅ 租户 {tenant_name} 创建成功")
except ChromaError as e:
if "already exists" in str(e):
print(f"ℹ️ 租户 {tenant_name} 已存在,跳过创建")
else:
# 其它异常继续抛出
raise
def ensure_database(db_name: str, tenant_name: str):
"""确保数据库在指定租户下存在,存在则跳过"""
try:
admin.create_database(name=db_name, tenant=tenant_name)
print(f"✅ 数据库 {db_name}(租户 {tenant_name})创建成功")
except ChromaError as e:
if "already exists" in str(e):
print(f"ℹ️ 数据库 {db_name} 在租户 {tenant_name} 下已存在,跳过创建")
else:
raise
if __name__ == "__main__":
t_name = "tenant_a"
db_name = "prod"
ensure_tenant(t_name)
ensure_database(db_name, t_name)运行输出如下:
✅ 租户 tenant_a 已存在,跳过创建
✅ 数据库 prod 在租户 tenant_a 下已存在,跳过创建然后连的时候指定租户和数据库:
# 后续业务客户端
client = chromadb.HttpClient(
host="localhost",
port=8000,
tenant=t_name,
database=db_name
)
print(client)
# <chromadb.api.client.Client object at 0x0000029F5775C440>查询和删除租户和数据库(租户不允许删除,没有对应的删除方法,数据库可以删除),例如:
import chromadb
from chromadb import Settings
settings = Settings(
chroma_api_impl="chromadb.api.fastapi.FastAPI",
chroma_server_host="localhost",
chroma_server_http_port=8000,
)
admin = chromadb.AdminClient(settings=settings)
# 租户
tenant = admin.get_tenant("tenant_a")
print(f"租户信息:{tenant}")
# 数据库
db = admin.get_database("prod", tenant="tenant_a")
print(f"数据库:{db}")
# 删除数据库
admin.delete_database("prod", tenant="tenant_a")
# 验证数据库信息
db = admin.get_database("prod", tenant="tenant_a") # 报错,数据库不存在
print(f"数据库:{db}")运行代码,输出日志:
租户信息:{'name': 'tenant_a'}
数据库:{'id': 'b0fcf6dc-3497-4519-8182-f85899485434', 'name': 'prod', 'tenant': 'tenant_a'}
Traceback (most recent call last):
...
chromadb.errors.NotFoundError: Database [prod] not found. Are you sure it exists?说实话,在单机版里多租户用得不多。真正需要隔离的时候,我更倾向直接起多个 Chroma 实例(不同端口/不同数据目录),隔离更彻底,运维也更直观。多租户/多库在数据量大、要统一管理的时候才划算。