{"record":{"id":"dbc9ffebdfcbc4d6","repo":"chroma-core/chroma","slug":"database-name-must-be-at-least-3-characters-long","errorCode":null,"errorMessage":"Database name must be at least 3 characters long","messagePattern":"Database name must be at least 3 characters long","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"chromadb/api/segment.py","lineNumber":161,"sourceCode":"        self._settings = system.settings\n        self._sysdb = self.require(SysDB)\n        self._manager = self.require(SegmentManager)\n        self._executor = self.require(Executor)\n        self._quota_enforcer = self.require(QuotaEnforcer)\n        self._product_telemetry_client = self.require(ProductTelemetryClient)\n        self._opentelemetry_client = self.require(OpenTelemetryClient)\n        self._producer = self.require(Producer)\n        self._rate_limit_enforcer = self._system.require(RateLimitEnforcer)\n\n    @override\n    def heartbeat(self) -> int:\n        return int(time.time_ns())\n\n    @trace_method(\"SegmentAPI.create_database\", OpenTelemetryGranularity.OPERATION)\n    @override\n    def create_database(self, name: str, tenant: str = DEFAULT_TENANT) -> None:\n        if len(name) < 3:\n            raise ValueError(\"Database name must be at least 3 characters long\")\n\n        self._quota_enforcer.enforce(\n            action=Action.CREATE_DATABASE,\n            tenant=tenant,\n            name=name,\n        )\n\n        self._sysdb.create_database(\n            id=uuid4(),\n            name=name,\n            tenant=tenant,\n        )\n\n    @trace_method(\"SegmentAPI.get_database\", OpenTelemetryGranularity.OPERATION)\n    @override\n    def get_database(self, name: str, tenant: str = DEFAULT_TENANT) -> t.Database:\n        return self._sysdb.get_database(name=name, tenant=tenant)\n","sourceCodeStart":143,"sourceCodeEnd":179,"githubUrl":"https://github.com/chroma-core/chroma/blob/aecdd12c8a891610db8653630b066b32ceb678b5/chromadb/api/segment.py#L143-L179","documentation":"SegmentAPI.create_database (chromadb/api/segment.py:155) validates that a database name has at least 3 characters before creating it. Shorter names raise ValueError before any quota check or sysdb write happens, so nothing is persisted.","triggerScenarios":"client.create_database('db') or create_database('a') - any name with len < 3, including empty string ''.","commonSituations":"Creating per-environment databases with terse names ('dv', 'qa', 'p'); passing an empty or truncated variable (e.g. os.environ.get('DB_NAME', '')) straight into create_database; test fixtures with 1-2 char names.","solutions":["Use a name of 3+ characters: 'db' -> 'dev-db'","Default/fallback to a valid name when the source variable may be empty or short","Validate tenant/database names at config load time, not at call time"],"exampleFix":"# before\nclient.create_database(name=os.environ.get('DB_NAME', ''))  # ValueError if short/empty\n\n# after\ndb_name = os.environ.get('DB_NAME') or 'default-db'\nassert len(db_name) >= 3\nclient.create_database(name=db_name)","handlingStrategy":"validation","validationCode":"def validate_resource_name(name: str, minimum: int = 3) -> str:\n    name = (name or '').strip()\n    if len(name) < minimum:\n        raise ValueError(f'name must be at least {minimum} characters: {name!r}')\n    return name\n\n# db = validate_resource_name(os.environ.get('DB_NAME', ''))","typeGuard":"def is_valid_db_name(name: str) -> bool:\n    return isinstance(name, str) and len(name.strip()) >= 3","tryCatchPattern":"try:\n    client.create_database(name=db_name)\nexcept ValueError as e:\n    if 'at least 3 characters' in str(e):\n        client.create_database(name=f'db-{db_name}')\n    else:\n        raise","preventionTips":["Enforce a 3+ character minimum in your own config validation for database names","Default empty environment variables to a valid name before use","Use descriptive environment names ('dev-db') instead of 1-2 letter codes"],"tags":["chroma","database-name","validation","python"],"backgroundTag":"invalid-resource-name","analyzedSha":"aecdd12c8a891610db8653630b066b32ceb678b5","analyzedAt":"2026-08-16T21:53:27.228Z","schemaVersion":2},"datasetVersion":"2026-08-16T23:17:17.608Z"}