{"record":{"id":"8d4c51c2b8e995a3","repo":"zylon-ai/private-gpt","slug":"unsupported-store-type-store","errorCode":null,"errorMessage":"Unsupported store type: {store}","messagePattern":"Unsupported store type: (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"private_gpt/components/persistence/persistence_component.py","lineNumber":73,"sourceCode":"        client: Any,\n    ) -> MigrationBackend:\n        match store:\n            case \"postgres\" | \"sqlite\":\n                from private_gpt.components.migrations.backend.sqlalchemy_backend import (\n                    SQLAlchemyMigrationBackend,\n                )\n\n                engine = client.sync_session.kw.get(\"bind\")\n                if engine is None:\n                    raise ValueError(\n                        f\"Cannot resolve SQLAlchemy engine for migration store '{store}'\"\n                    )\n                return SQLAlchemyMigrationBackend(\n                    engine=engine,\n                    schema_name=self._settings.database.schema_name,\n                )\n            case _:\n                raise ValueError(f\"Unsupported store type: {store}\")\n\n    def apply_migrations(self) -> None:\n        with self._lock:\n            if self._migrations_applied:\n                logger.info(\"Migrations already applied in this process; skipping\")\n                return\n\n            store = self._settings.database.provider\n            schema = self._settings.database.schema_name\n            logger.info(\n                \"Applying migrations with provider=%s schema=%s total=%s\",\n                store,\n                schema,\n                len(MIGRATIONS),\n            )\n            client = self.get_client(store)\n            if client is None:\n                raise ValueError(","sourceCodeStart":55,"sourceCodeEnd":91,"githubUrl":"https://github.com/zylon-ai/private-gpt/blob/4a030776a31a901ad80b1bf4d7faa2c1a367efbb/private_gpt/components/persistence/persistence_component.py#L55-L91","documentation":"The `match store` in `_get_migration_backend` handles only 'postgres' and 'sqlite'; any other `settings.database.provider` value falls to `case _` and raises `ValueError(f\"Unsupported store type: {store}\")`. Note this is backend selection, independent of whether the provider's client deps are installed.","triggerScenarios":"Setting `database.provider` to a value outside {postgres, sqlite} (typo, or a provider supported for storage but not migrations) and then calling `apply_migrations()` (run at startup) or `revert_migrations()`; provider strings with different casing/whitespace.","commonSituations":"Hand-edited settings with provider typos; new provider values introduced by config tooling but not by the migration layer; case mismatches.","solutions":["Set `database.provider` to exactly `postgres` or `sqlite`","Check for typos/casing/whitespace in the settings value","If you added a custom provider, extend `_get_migration_backend` and `get_client` with a matching case and backend"],"exampleFix":"# before\ndatabase:\n  provider: postgresql  # unsupported\n\n# after\ndatabase:\n  provider: postgres","handlingStrategy":"validation","validationCode":"SUPPORTED_MIGRATION_STORES = {\"postgres\", \"sqlite\"}\nif settings.database.provider not in SUPPORTED_MIGRATION_STORES:\n    raise ValueError(\n        f\"database.provider must be one of {sorted(SUPPORTED_MIGRATION_STORES)}, \"\n        f\"got {settings.database.provider!r}\"\n    )","typeGuard":"def is_supported_migration_store(store: str) -> bool:\n    return store in {\"postgres\", \"sqlite\"}","tryCatchPattern":"try:\n    persistence.apply_migrations()\nexcept ValueError as e:\n    if \"Unsupported store type\" in str(e):\n        raise ConfigurationError(str(e)) from e\n    raise","preventionTips":["Validate database.provider against a constant set at settings load time","Reject unknown enum values in settings parsing (pydantic Literal/enum) instead of at migration time"],"tags":["configuration","migrations","persistence","unsupported-provider"],"backgroundTag":null,"analyzedSha":"4a030776a31a901ad80b1bf4d7faa2c1a367efbb","analyzedAt":"2026-08-15T03:51:26.951Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}