Chroma 教程

多租户与多数据库

🎉摘要:学习如何使用Chroma的AdminClient创建租户和数据库,实现数据隔离。包括租户和数据库的创建、查询及删除操作,并连接指定租户数据库。

在“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 实例(不同端口/不同数据目录),隔离更彻底,运维也更直观。多租户/多库在数据量大、要统一管理的时候才划算。

  

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