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-dltgrants 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)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| erpl_dlt-2026.9.4.tar.gz | 158.7 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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 logRelease 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 logSecurity 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.
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 logA 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.