{"id":"f7d257d0557f87fb","repo":"redis/redis-py","slug":"given-database-is-not-a-member-of-database-list","errorCode":null,"errorMessage":"Given database is not a member of database list","messagePattern":"Given database is not a member of database list","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"redis/asyncio/multidb/client.py","lineNumber":164,"sourceCode":"    def get_databases(self) -> Databases:\n        \"\"\"\n        Returns a sorted (by weight) list of all databases.\n        \"\"\"\n        return self._databases\n\n    async def set_active_database(self, database: AsyncDatabase) -> None:\n        \"\"\"\n        Promote one of the existing databases to become an active.\n        \"\"\"\n        exists = None\n\n        for existing_db, _ in self._databases:\n            if existing_db == database:\n                exists = True\n                break\n\n        if not exists:\n            raise ValueError(\"Given database is not a member of database list\")\n\n        await self._check_db_health(database)\n\n        if database.circuit.state == CBState.CLOSED:\n            highest_weighted_db, _ = self._databases.get_top_n(1)[0]\n            await self.command_executor.set_active_database(\n                database, GeoFailoverReason.MANUAL\n            )\n            return\n\n        raise NoValidDatabaseException(\n            \"Cannot set active database, database is unhealthy\"\n        )\n\n    async def add_database(\n        self, config: DatabaseConfig, skip_initial_health_check: bool = True\n    ):\n        \"\"\"","sourceCodeStart":146,"sourceCodeEnd":182,"githubUrl":"https://github.com/redis/redis-py/blob/da03cdc7e8731092b13e395605c3c1fb2de25de1/redis/asyncio/multidb/client.py#L146-L182","documentation":"Raised by `MultiDBClient.set_active_database()` (redis/asyncio/multidb/client.py:164) when the passed `AsyncDatabase` object is not present in the client's internal `_databases` weighted list. Membership is checked by equality (`existing_db == database`), so a database constructed independently or belonging to another MultiDBClient instance will not match.","triggerScenarios":"Calling `await client.set_active_database(db)` where `db` was not obtained from `client.get_databases()` — e.g. a freshly constructed `Database(...)` object, a database from a different MultiDBClient, or a stale reference after `remove_database()`.","commonSituations":"Building a Database manually instead of fetching it from the client; passing a database from one MultiDBClient into another; holding a reference to a database that was removed.","solutions":["Obtain the database from `client.get_databases()` and pass that exact object: `[db for db, _ in client.get_databases()]`.","If adding a new database, use `await client.add_database(config)` first, then retrieve it from `get_databases()`.","Do not construct `Database(...)` directly to pass into `set_active_database`."],"exampleFix":"# before\ndb = Database(client=my_client, circuit=cb, weight=1.0)\nawait client.set_active_database(db)  # ValueError\n\n# after\ndbs = [db for db, _ in client.get_databases()]\nawait client.set_active_database(dbs[0])","handlingStrategy":"validation","validationCode":"def database_is_registered(client, database) -> bool:\n    return any(db is database for db, _ in client.get_databases())\n\n# assert database_is_registered(client, db) before set_active_database","typeGuard":"from redis.asyncio.multidb.database import AsyncDatabase\n\ndef is_registered_database(client, obj) -> bool:\n    return isinstance(obj, AsyncDatabase) and any(db is obj for db, _ in client.get_databases())","tryCatchPattern":"try:\n    await client.set_active_database(db)\nexcept ValueError as e:\n    if 'not a member' in str(e):\n        # fetch a valid db from get_databases() and retry\n        ...\n    raise","preventionTips":["Always source the database object from `client.get_databases()`, never construct `Database(...)` directly for this call.","Do not cache database references across add/remove operations.","Use identity (`is`) checks when validating membership, since equality is also defined on Database."],"tags":["multidb","validation","configuration"],"analyzedSha":"da03cdc7e8731092b13e395605c3c1fb2de25de1","analyzedAt":"2026-08-04T20:26:47.563Z","schemaVersion":2}