Skip to main content

erpl-dlt

Licence notice, above the fold. This package — the Python glue — is Apache-2.0. The ERPL DuckDB extension binaries it loads are separately licensed under BUSL-1.1 by DataZoo GmbH. Installing erpl-dlt grants you no licence to them. See NOTICE.

dlt sources for SAP, built on the ERPL DuckDB extensions.

pip install erpl-dlt
import dlt
from erpl_dlt import erpl_rfc_source

pipeline = dlt.pipeline(pipeline_name="sap", destination="duckdb", dataset_name="sap_raw")
pipeline.run(erpl_rfc_source(table_names=["SFLIGHT", "SBOOK"]))

Five SAP read paths, one connection layer:

Source Reads
erpl_rfc_source Any table or CDS view over RFC, with projection and filter push-down
erpl_odata_source Any OData v2/v4 service
erpl_odp_source ODP delta — real server-side change data, over RFC or the SAP Gateway
erpl_bics_source BW InfoProviders and BEx queries
erpl_invoke_source Remote-enabled function modules and BAPIs

Configuration

Credentials resolve through dlt, so nothing needs to be passed in code:

# .dlt/secrets.toml
[sources.erpl_dlt.credentials]
ashost = "sap.example.com"
sysnr = "00"
client = "100"
user = "SVC_DLT"
password = "..."

They are bound as parameters to DuckDB's CREATE SECRET, never formatted into SQL text — query text reaches logs.

What the sources do

from erpl_dlt import erpl_rfc_source

erpl_rfc_source(
    table_names=["SFLIGHT", "SBOOK"],
    # Pushed into SAP. On a 55-column table, naming two columns measured 3.8x
    # faster than reading all of them.
    columns={"SBOOK": ["CARRID", "CONNID", "FLDATE", "LOCCURAM"]},
    # Becomes a WHERE clause that DuckDB pushes into the RFC call, so SAP does
    # the filtering. `EXPLAIN` shows it as `Filters:` inside SAP_READ_TABLE.
    cursor_columns={"SBOOK": "FLDATE"},
    primary_keys={"SBOOK": ["CARRID", "CONNID", "FLDATE", "BOOKID"]},
)

Extraction is Arrow-native: batches come from DuckDB's to_arrow_reader and go straight to dlt, so no row becomes a Python dict. SAP's types arrive correct without casting — DATS as date32[day], CURR as decimal128, an empty SAP date as NULL. dlt's naming normaliser will rename columns containing digits: AS4DATE lands as as4_date.

Each resource takes its own DuckDB cursor, so parallelized=True is safe.

erpl_odp_source uses SAP's ODQ subscriber process as the delta identity. By default that name is stable for the dlt pipeline name and ODP provider, and it is capped at SAP's 32-character field width with a hash suffix so long names do not collide by truncation. If you need a pre-existing SAP subscriber, pass subscriber_processes={provider_name: "SUBSCRIBER"}; after a delta run records a subscriber in dlt state, a later run that would use a different subscriber is refused instead of silently starting a new delta queue.

ODP delta reads are not transactional with respect to the destination load. SAP's pointer can advance while dlt commits nothing; what can be recovered then depends on ODQ confirmation semantics. ERPL's source shows a recover mode for the last unconfirmed packet, but whether a particular installed ERPL build exposes that mode is checked from duckdb_functions() at runtime.

Development

uv venv && uv pip install -e ".[dev]"
just check            # ruff, mypy --strict, unit tests
ERPL_IT=1 just it     # integration tests against a real SAP system

Integration tests are skipped unless ERPL_IT=1 and credentials are set. They use no mocks: they assert that a projection reaches SAP, that EXPLAIN shows the predicate inside the scan, that ODP's delta token survives a fresh process, and that DECIMAL/DATE/TIME survive into the destination schema.

Status

Tested against ERPL and ERPL Web v2026.09.04, DuckDB 1.5.5, dlt 1.30, Python 3.10–3.13, on Linux x86-64 — the only platform ERPL publishes these extensions for. Releases follow CalVer matching the supported ERPL release (e.g. 2026.9.4).

Metadata

Release files for erpl-dlt 2026.9.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for erpl-dlt 2026.9.4
File Size Uploaded Provenance
erpl_dlt-2026.9.4.tar.gz 158.7 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for erpl-dlt 2026.9.4
File Interpreter ABI Platform
erpl_dlt-2026.9.4-py3-none-any.whl Python 3 none any Details

Total release size: 189.2 kB

Release files / erpl_dlt-2026.9.4.tar.gz

Download URL erpl_dlt-2026.9.4.tar.gz
Size 158.7 kB
Tags Source
SHA-256 checksum
How to use checksums
5f2838386bc473bbd50d2c0f72ad10037ef6dffa61882009e2b20f766312cd04
BLAKE2b-256 checksum
How to use checksums
8108512d9f50635b871299c23fae12fffb6de1b005dd1dadc683380e3eaafdb4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 13, 2026.

Transparency log

Release files / erpl_dlt-2026.9.4-py3-none-any.whl

Download URL erpl_dlt-2026.9.4-py3-none-any.whl
Size 30.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
b25ca8d4296586ed8644c9ba7383d0d104f3ebe33b7bcbf1d85945d6644e4810
BLAKE2b-256 checksum
How to use checksums
7cc641aa7e19869dae10e8675d586c0c88d3a199cafdc535d6f60f4eae68a08c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 13, 2026.

Transparency log

Security for erpl-dlt 2026.9.4

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for erpl_dlt-2026.9.4.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 13, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Release history Release notifications | RSS feed

This release

2026.9.4 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page