{"record":{"id":"d5c887dddfa2bd25","repo":"apache/superset","slug":"engine-engine-s-cannot-be-configured-through-p","errorCode":null,"errorMessage":"Engine \"%(engine)s\" cannot be configured through parameters.","messagePattern":"Engine \"(.+?)\" cannot be configured through parameters\\.","errorType":"validation","errorClass":"InvalidEngineError","httpStatus":422,"severity":"error","filePath":"superset/commands/database/validate.py","lineNumber":68,"sourceCode":"        engine = self._properties[\"engine\"]\n        driver = self._properties.get(\"driver\")\n\n        if engine in BYPASS_VALIDATION_ENGINES:\n            # Skip engines that are only validated onCreate, but still surface\n            # database_name uniqueness and SSH tunnel field errors so the\n            # progressive validation flow stays consistent across engines.\n            errors: list[SupersetError] = []\n            if database_name_error := self._get_database_name_error():\n                errors.append(database_name_error)\n            errors.extend(self._get_ssh_tunnel_errors())\n            if errors:\n                event_logger.log_with_context(action=\"validation_error\", engine=engine)\n                raise InvalidParametersError(errors)\n            return\n\n        engine_spec = get_engine_spec(engine, driver)\n        if not hasattr(engine_spec, \"parameters_schema\"):\n            raise InvalidEngineError(\n                SupersetError(\n                    message=__(\n                        'Engine \"%(engine)s\" cannot be configured through parameters.',\n                        engine=engine,\n                    ),\n                    error_type=SupersetErrorType.GENERIC_DB_ENGINE_ERROR,\n                    level=ErrorLevel.ERROR,\n                ),\n            )\n\n        # perform initial validation (host, port, database, username)\n        errors = engine_spec.validate_parameters(self._properties)  # type: ignore\n\n        # Collect database_name errors along with parameter errors\n        if database_name_error := self._get_database_name_error():\n            errors.append(database_name_error)\n\n        # Collect SSH tunnel errors","sourceCodeStart":50,"sourceCodeEnd":86,"githubUrl":"https://github.com/apache/superset/blob/f4587218dd19d046c3e4d00063e7d27f8a2ed354/superset/commands/database/validate.py#L50-L86","documentation":"InvalidEngineError raised by ValidateDatabaseParametersCommand.run when the resolved engine spec class has no 'parameters_schema' attribute. Only engines that implement a marshmallow parameters_schema (host/port/database/username-style forms) can be configured through the parameter flow; engines driven solely by SQLAlchemy URLs or service-account config cannot, so Superset rejects the validation call with GENERIC_DB_ENGINE_ERROR 'Engine \"<engine>\" cannot be configured through parameters.'","triggerScenarios":"Calling the database validation endpoint (or the UI modal's parameter form) for an engine whose spec lacks parameters_schema — commonly custom/third-party db_engine_specs or engines configured only via SQLAlchemy URI; passing an engine alias that resolves to a base/abstract spec.","commonSituations":"Custom engine plugins registered without a parameters_schema; older engine specs predating the parameter-driven modal; scripts hitting the validate API with engine names only supported in the 'Advanced' / URI tab of the connection form.","solutions":["For this engine, use the SQLAlchemy URI (Advanced) tab instead of the parameter form — validation via parameters is unsupported","If you maintain a custom db_engine_spec, add a parameters_schema (marshmallow Schema) to enable the parameter flow","Check the engine name spelling/resolution — an unknown alias may fall back to a spec without a schema","Update Superset: newer specs gain parameters_schema over releases"],"exampleFix":"# before: parameter-mode validation for engine without schema\n{\"engine\": \"customdb\", \"parameters\": {...}}\n# after: configure by URI\n{\"engine\": \"customdb\", \"sqlalchemy_uri\": \"customdb://user:pw@host/db\"}","handlingStrategy":"type-guard","validationCode":"from superset.db_engine_specs import get_engine_spec\n\ndef engine_supports_parameters(engine: str, driver: str | None) -> bool:\n    spec = get_engine_spec(engine, driver)\n    return hasattr(spec, \"parameters_schema\")","typeGuard":"def supports_parameter_flow(spec) -> bool:\n    return getattr(spec, \"parameters_schema\", None) is not None","tryCatchPattern":"from superset.commands.database.exceptions import InvalidEngineError\ntry:\n    ValidateDatabaseParametersCommand(props).run()\nexcept InvalidEngineError:\n    # fall back to the SQLAlchemy URI (Advanced) configuration path\n    configure_via_sqlalchemy_uri(props)","preventionTips":["Use the URI/Advanced tab for engines without parameters_schema","Custom engine specs: implement parameters_schema to join the parameter flow","Verify the engine name resolves to the intended spec"],"tags":["database-connection","engine-spec","validation","plugin"],"backgroundTag":null,"analyzedSha":"f4587218dd19d046c3e4d00063e7d27f8a2ed354","analyzedAt":"2026-08-14T22:39:27.425Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}