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 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.

Metadata

Release files for erpl-dlt 0.1.0

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 0.1.0
File Size Uploaded Provenance
erpl_dlt-0.1.0.tar.gz 158.7 kB With provenance Details

Built distribution (wheel)

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

Total release size: 189.1 kB

Release files / erpl_dlt-0.1.0.tar.gz

Download URL erpl_dlt-0.1.0.tar.gz
Size 158.7 kB
Tags Source
SHA-256 checksum
How to use checksums
70d05ba050c86b2818598a85a0ffe38f157554797d7f61db2fe6a1fb738375e4
BLAKE2b-256 checksum
How to use checksums
318b7834ad7046b21e64cd118dfb10d2f148e8ad24ce2b6f187f82ac2a211cdb
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-0.1.0-py3-none-any.whl

Download URL erpl_dlt-0.1.0-py3-none-any.whl
Size 30.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
db771d37183418a50160b2564b8c723336681a552e95dd3d70e0bc9880f5c1b9
BLAKE2b-256 checksum
How to use checksums
ca0042a71994a09983f3c93da753c1a88e81b870d437b57ae481f64043e36591
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 0.1.0

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-0.1.0.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

0.1.0 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