← All databases

Database · native ODBC

SAP HANA Express into Apache Arrow with ADBC

SAP HANA Express 2.00.088 (HANA 2.0 SPS08), read and written through adbcBridge — the ADBC driver that loads the database's ODBC driver — verified on Linux, macOS arm64 and Windows x64. Everything below is the compatibility matrix's record for this row.

Status

Linux✓ pass

PASS

macOS arm64✓ pass

PASS (HDB (via ODBC) 02.00.0088, SAP HANA client 2.29.25 arm64 libodbcHDB.dylib, against the Linux-hosted server over one LAN hop, connected straight to the tenant SQL port — with DATABASENAME set, HANA redirects the client to the container's internal address, which only the Docker host can reach — so the numbers are network-bound: fetch 43.5k rows/s, ingest 20–26k rows/s with parameter arrays and 62 rows/s one row per execute, one commit round trip each; pyodbc within 10% of the bridge on fetch)

Windows x64✓ pass

PASS (HDB (via ODBC) 02.00.0088, SAP HANA client 2.29.25 libodbcHDB.dll registered as HDBODBC — the name carries the libodbchdb key, so the HANA quirks apply on Windows unchanged; saplabs/hanaexpress under Docker Desktop, 12 GB, ~16 min to Startup finished!; connected straight to the tenant SQL port 39041 — published through a socat sidecar, since the compose service publishes 39013/39017 only, and with DATABASENAME set HANA redirects the client to the container's internal address, which a Windows host cannot reach; fetch 1.44–1.48M rows/s, ingest 364–398k rows/s with parameter arrays and 1.7k rows/s one row per execute)

Driver and connection string

ODBC driver
SAP HANA client ODBC 2.29.25 (libodbcHDB.so, native wire)
Wire
native ODBC
adbcBridge
0.1.1 (release)

The connection string the matrix used, as the connection strings reference records it (Databases with their own native protocol and ODBC driver); {drv} is the driver library or its name from odbcinst.ini, and the host, port and credentials are the test server's.

Driver={drv};SERVERNODE=127.0.0.1:39017;UID=SYSTEM;PWD=AdbcBridge2026;DATABASENAME=HXE;

Python

import adbcbridge

# {drv}: the ODBC driver library (path), or its name from odbcinst.ini
conn = adbcbridge.connect(uri="Driver={drv};SERVERNODE=127.0.0.1:39017;UID=SYSTEM;PWD=AdbcBridge2026;DATABASENAME=HXE;")
with conn.cursor() as cur:
    cur.execute("SELECT * FROM my_table")
    table = cur.fetch_arrow_table()      # pyarrow.Table

Polars and pandas

import polars as pl, pandas as pd

df = pl.read_database("SELECT * FROM my_table", connection=conn)   # Polars, Arrow-native
pdf = pd.read_sql("SELECT * FROM my_table", conn)                   # pandas 2.2+, ADBC connection

pip install adbcbridge brings the driver library; the SAP HANA Express ODBC driver is installed the way its vendor documents, then named in Driver=. Rust, Go, C# and Java use the same connection string through their ADBC driver managers — see the docs.

What the matrix recorded

SAP's in-memory column store, first-party server (saplabs/hanaexpress, which pulled anonymously) driven by SAP's own first-party driver from the free HANA client download — the EULA that gates it is passed with the cookie its checkbox sets, and the ODBC member of the tarball needs no installer, no LD_LIBRARY_PATH and no .ini of its own.

What this stack needed

MeasuredIngest 1,142,092 rows/s (array binding), fetch 6,768,257 rows/s

Read next