{"record":{"id":"18bd3f17fc4dbb4b","repo":"chroma-core/chroma","slug":"could-not-connect-to-database-database-for-tena","errorCode":null,"errorMessage":"Could not connect to database ${database} for tenant ${tenant}. Are you sure it exists? Underlying error:\n${error}","messagePattern":"Could not connect to database (.+?) for tenant (.+?)\\. Are you sure it exists\\? Underlying error:\n(.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"clients/js/packages/chromadb-core/src/utils.ts","lineNumber":81,"sourceCode":"  try {\n    await adminClient.getTenant({ name: tenant });\n  } catch (error) {\n    if (error instanceof ChromaConnectionError) {\n      throw error;\n    }\n    throw new Error(\n      `Could not connect to tenant ${tenant}. Are you sure it exists? Underlying error:\n${error}`,\n    );\n  }\n\n  try {\n    await adminClient.getDatabase({ name: database, tenantName: tenant });\n  } catch (error) {\n    if (error instanceof ChromaConnectionError) {\n      throw error;\n    }\n    throw new Error(\n      `Could not connect to database ${database} for tenant ${tenant}. Are you sure it exists? Underlying error:\n${error}`,\n    );\n  }\n}\n\nexport function isBrowser() {\n  return (\n    typeof window !== \"undefined\" && typeof window.document !== \"undefined\"\n  );\n}\n\nfunction arrayifyParams(\n  params: BaseRecordOperationParams,\n): MultiRecordOperationParams {\n  return {\n    ids: toArray(params.ids),\n    embeddings: params.embeddings","sourceCodeStart":63,"sourceCodeEnd":99,"githubUrl":"https://github.com/chroma-core/chroma/blob/aecdd12c8a891610db8653630b066b32ceb678b5/clients/js/packages/chromadb-core/src/utils.ts#L63-L99","documentation":"Second half of validateTenantDatabase(): after the tenant check passes, AdminClient.getDatabase({ name, tenantName }) is called; a non-ChromaConnectionError failure (i.e., the server responded, typically 404) is wrapped with this message. It means the tenant exists but the database does not exist under that tenant on this server.","triggerScenarios":"new ChromaClient({ tenant, database: 'prod-db' }) on first init(), adminClient.setTenant({ tenant, database: 'prod-db' }), or adminClient.setDatabase({ database: 'prod-db' }) where the database was never created via adminClient.createDatabase({ name: 'prod-db', tenantName: tenant }) or was created under a different tenant.","commonSituations":"Creating the tenant but forgetting the database in setup scripts; assuming default-tenant databases are visible under a custom tenant; wrong tenantName when creating the database; stale database names after renaming.","solutions":["Create the database under the correct tenant: await adminClient.createDatabase({ name: database, tenantName: tenant }) (idempotent for existing databases).","List databases for the tenant to verify: (await adminClient.listDatabases({ tenantName: tenant })).forEach(d => console.log(d.name)).","Confirm the database was not created under a different tenant (databases are tenant-scoped, not global).","Verify tenant/database strings for typos and case sensitivity."],"exampleFix":"// before\nawait adminClient.setDatabase({ database: \"prod-db\" }); // never created -> throws\n\n// after\nawait adminClient.createDatabase({ name: \"prod-db\", tenantName: \"acme\" });\nawait adminClient.setDatabase({ database: \"prod-db\" });","handlingStrategy":"validation","validationCode":"const ensureDatabase = async (admin: AdminClient, tenant: string, database: string) => {\n  try {\n    await admin.getDatabase({ name: database, tenantName: tenant });\n  } catch (e) {\n    if (e instanceof ChromaConnectionError) throw e;\n    await admin.createDatabase({ name: database, tenantName: tenant });\n  }\n};\nawait ensureDatabase(admin, \"acme\", \"prod-db\");","typeGuard":null,"tryCatchPattern":"try {\n  await adminClient.setDatabase({ database: \"prod-db\" });\n} catch (e) {\n  const msg = e instanceof Error ? e.message : String(e);\n  if (msg.startsWith(\"Could not connect to database\")) {\n    throw new Error(`Database 'prod-db' missing under tenant — createDatabase({ name, tenantName }) first`, { cause: e });\n  }\n  throw e;\n}","preventionTips":["Provision databases right after tenants in setup scripts; databases are tenant-scoped, so always pass tenantName.","Run a health check that calls getDatabase for each configured tenant/database pair at app startup."],"tags":["database","tenant","admin-api","multi-tenancy","not-found"],"backgroundTag":"database-not-found","analyzedSha":"aecdd12c8a891610db8653630b066b32ceb678b5","analyzedAt":"2026-08-16T21:53:27.228Z","schemaVersion":2},"datasetVersion":"2026-08-16T23:17:17.608Z"}