{"record":{"id":"0b9ba65460bfc4cc","repo":"pola-rs/polars","slug":"cannot-use-credential-provider-when-passing-a-delt-0b9ba6","errorCode":null,"errorMessage":"cannot use credential_provider when passing a DeltaTable object","messagePattern":"cannot use credential_provider when passing a DeltaTable object","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"py-polars/src/polars/lazyframe/frame.py","lineNumber":3307,"sourceCode":"        _check_for_unsupported_types(self.collect_schema().dtypes())\n\n        if isinstance(target, (str, Path)):\n            target = _resolve_delta_lake_uri(str(target), strict=False)\n\n        from polars.io.cloud.credential_provider._builder import (\n            _init_credential_provider_builder,\n        )\n        from polars.io.cloud.credential_provider._providers import (\n            _get_credentials_from_provider_expiry_aware,\n        )\n\n        if not isinstance(target, DeltaTable):\n            credential_provider_builder = _init_credential_provider_builder(\n                credential_provider, target, storage_options, \"sink_delta\"\n            )\n        elif credential_provider is not None and credential_provider != \"auto\":\n            msg = \"cannot use credential_provider when passing a DeltaTable object\"\n            raise ValueError(msg)\n        else:\n            credential_provider_builder = None\n\n        del credential_provider\n\n        credential_provider_creds = {}\n\n        if credential_provider_builder and (\n            provider := credential_provider_builder.build_credential_provider()\n        ):\n            credential_provider_creds = (\n                _get_credentials_from_provider_expiry_aware(provider) or {}\n            )\n\n        # We aren't calling into polars-native write functions so we just update\n        # the storage_options here.\n        storage_options = (\n            {**(storage_options or {}), **credential_provider_creds}","sourceCodeStart":3289,"sourceCodeEnd":3325,"githubUrl":"https://github.com/pola-rs/polars/blob/df599052daf96e7a9cc30a3b0c6bd25d6947e3c0/py-polars/src/polars/lazyframe/frame.py#L3289-L3325","documentation":"When sink_delta()'s target is an already-constructed DeltaTable object, credentials are managed by that object itself, so polars refuses to also apply a credential_provider. Passing any credential_provider other than None or the sentinel 'auto' alongside a DeltaTable target raises ValueError.","triggerScenarios":"dt = DeltaTable('s3://bucket/path', storage_options=...); lf.sink_delta(dt, credential_provider=CredentialProvider...) — mixing object-target with provider-based auth.","commonSituations":"Cloud storage (S3/Azure/GCS) auth refactorings; code that generically passes credential_provider to all sink calls regardless of target type.","solutions":["Drop the credential_provider argument when target is a DeltaTable","Instead pass storage_options/credential config to DeltaTable() when constructing it","Or switch to a string URI target: lf.sink_delta('s3://bucket/path', credential_provider=...) so polars manages credentials","Keep credential_provider='auto' or None if you must pass something alongside a DeltaTable"],"exampleFix":"# before\ndt = DeltaTable('s3://bucket/path')\nlf.sink_delta(dt, credential_provider=credential_provider_obj)\n\n# after\ndt = DeltaTable('s3://bucket/path', storage_options=storage_options)\nlf.sink_delta(dt)","handlingStrategy":"type-guard","validationCode":"from deltalake import DeltaTable\nif isinstance(target, DeltaTable):\n    assert credential_provider in (None, 'auto'), 'DeltaTable target manages its own credentials'\n    lf.sink_delta(target)\nelse:\n    lf.sink_delta(target, credential_provider=credential_provider)","typeGuard":"def is_delta_table(target) -> bool:\n    from deltalake import DeltaTable\n    return isinstance(target, DeltaTable)","tryCatchPattern":null,"preventionTips":["Decide target type once in the pipeline: URI for polars-managed auth, DeltaTable for externally managed auth","Document that credential_provider applies only to string targets"],"tags":["polars","delta-lake","sink-delta","credentials","cloud-storage"],"backgroundTag":null,"analyzedSha":"df599052daf96e7a9cc30a3b0c6bd25d6947e3c0","analyzedAt":"2026-08-16T12:10:03.978Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}