adbc-driver-gizmosql
A Python ADBC driver for GizmoSQL with OAuth/SSO support — powered by a native Go driver core bundled in the wheel.
Overview
adbc-driver-gizmosql connects Python to GizmoSQL over Arrow Flight SQL
with GizmoSQL-specific features built in:
- OAuth/SSO browser flow — Authenticate via your identity provider (Google, Okta, etc.) with a single parameter change
- DBAPI 2.0 interface —
connect()/ cursors /fetch_arrow_table(), with the same API as the 1.x driver (migration guide) - DDL/DML auto-detection —
CREATE/INSERT/UPDATE/DELETEexecute immediately on the server (GizmoSQL plans queries lazily);... RETURNINGis eagerly materialized - Geometry-aware bulk ingest —
cursor.adbc_ingestpreservesGEOMETRYcolumns instead of degrading them toBLOB - Minimal dependencies — Only
adbc-driver-managerandpyarrow; the native driver library (written in Go, built onapache/arrow-adbc's Flight SQL driver) ships inside the platform wheel - OpenTelemetry tracing & structured logging — see Observability
Install
# Create and activate a virtual environment
python3 -m venv .venv
. .venv/bin/activate
pip install adbc-driver-gizmosql
Platform wheels are published for Linux (amd64/arm64 manylinux), macOS (arm64/amd64), and Windows (amd64/arm64). To develop from source, see the repository.
Usage
Start a GizmoSQL server
First — start a GizmoSQL server in Docker, serving the small TPC-H sample database bundled in the image:
docker run --name gizmosql \
--detach \
--rm \
--tty \
--init \
--publish 31337:31337 \
--env TLS_ENABLED="1" \
--env GIZMOSQL_USERNAME="gizmosql_user" \
--env GIZMOSQL_PASSWORD="gizmosql_password" \
--env DATABASE_FILENAME="data/TPC-H-small.duckdb" \
--env PRINT_QUERIES="1" \
--pull missing \
gizmodata/gizmosql:latest
Password authentication
from adbc_driver_gizmosql import dbapi as gizmosql
with gizmosql.connect("gizmosql://localhost:31337",
username="gizmosql_user",
password="gizmosql_password",
tls_skip_verify=True,
) as conn:
with conn.cursor() as cur:
cur.execute("SELECT n_nationkey, n_name FROM nation WHERE n_nationkey = ?",
parameters=[24])
table = cur.fetch_arrow_table()
print(table)
Choosing the catalog / schema at connect time
Pass catalog and/or db_schema to make them current for the session
(the standard ADBC adbc.connection.catalog / adbc.connection.db_schema
options, sent via Flight SQL SetSessionOptions). The catalog must already
be attached on the server. conn.adbc_current_catalog reads it back.
from adbc_driver_gizmosql import dbapi as gizmosql
with gizmosql.connect("gizmosql://localhost:31337",
username="gizmosql_user",
password="gizmosql_password",
tls_skip_verify=True,
catalog="analytics",
db_schema="main",
) as conn:
with conn.cursor() as cur:
cur.execute("SELECT current_catalog(), current_schema()")
print(cur.fetchone()) # ('analytics', 'main')
URI schemes
The preferred way to connect is the gizmosql:// URI scheme, which is
secure by default (gRPC with TLS):
| URI | Meaning |
|---|---|
gizmosql://host:31337 |
gRPC with TLS (default) |
gizmosql://host:31337?transport=tls |
gRPC with TLS (explicit) |
gizmosql://host:31337?transport=tcp |
gRPC plaintext (no TLS) |
grpc+tls://host:31337 |
Legacy TLS spelling (still supported) |
grpc+tcp://host:31337 / grpc://host:31337 |
Legacy plaintext spellings (still supported) |
flightsql://host:31337 |
Upstream Flight SQL spelling (still supported) |
The scheme is handled inside the driver library, so it also works in connection profiles.
DDL/DML — auto-detected and executed immediately
GizmoSQL plans queries lazily, so DDL/DML submitted through the normal
query path would never execute unless the result is fetched.
cursor.execute() automatically detects DDL/DML statements and executes
them immediately on the server, matching the behavior of the GizmoSQL
JDBC and ODBC drivers. No special API is needed — just use execute()
for everything:
from adbc_driver_gizmosql import dbapi as gizmosql
with gizmosql.connect("gizmosql://localhost:31337",
username="gizmosql_user",
password="gizmosql_password",
tls_skip_verify=True,
) as conn:
with conn.cursor() as cur:
# DDL and DML work with regular execute()
cur.execute("CREATE TABLE t (a INT)")
cur.execute("INSERT INTO t VALUES (1)")
# SELECT works as usual
cur.execute("SELECT * FROM t")
print(cur.fetch_arrow_table())
# RETURNING is eagerly materialized — the DML fires even if
# you never read the result
cur.execute("DELETE FROM t WHERE a = 1 RETURNING a")
print(cur.fetch_arrow_table())
# Cleanup
cur.execute("DROP TABLE t")
Note:
cursor.execute_update(query)is still available if you need the rows-affected count returned directly:rows = cur.execute_update("INSERT ...").
OAuth/SSO authentication
When your GizmoSQL server is configured with OAuth, simply change
auth_type:
from adbc_driver_gizmosql import dbapi as gizmosql
with gizmosql.connect("gizmosql://gizmosql.example.com:31337",
auth_type="external",
tls_skip_verify=True,
) as conn:
with conn.cursor() as cur:
cur.execute("SELECT CURRENT_USER AS user")
print(cur.fetch_arrow_table())
This will:
- Auto-discover the OAuth server endpoint
- Open your browser to the identity provider login page
- Poll for completion and retrieve the identity token
- Connect to GizmoSQL using the token via Basic Auth (
username="token")
Connection profiles
This driver supports ADBC connection profiles — reusable TOML files that bundle the server URI and options so connection code stays credential-free.
Create a profile, e.g. ~/.config/adbc/profiles/gizmosql_dev.toml on
Linux, ~/Library/Application Support/ADBC/Profiles/gizmosql_dev.toml
on macOS, or any directory listed in the ADBC_PROFILE_PATH environment
variable:
profile_version = 1
[Options]
uri = "gizmosql://gizmosql.example.com:31337"
username = "gizmosql_username"
# Keep secrets out of the file — substituted from the environment at connect time
password = "{{ env_var(GIZMOSQL_PASSWORD) }}"
Then connect by profile name (no uri needed):
from adbc_driver_gizmosql import dbapi as gizmosql
with gizmosql.connect(profile="gizmosql_dev") as conn:
with conn.cursor() as cur:
cur.execute("SELECT 1 AS value")
print(cur.fetch_arrow_table())
Notes:
connect("profile://gizmosql_dev")andconnect(profile="/abs/path/to/profile.toml")work too.- The profile does not need a
driverentry — the driver bundled with this package is supplied automatically. - Options passed explicitly to
connect()(e.g.username=,password=,db_kwargs=) take precedence over the profile's[Options]. - Boolean/typed driver options are plain strings in profiles, e.g.
"adbc.flight.sql.client_option.tls_skip_verify" = "true"(dotted keys must be quoted in TOML).
Advanced: Standalone OAuth token retrieval
from adbc_driver_gizmosql import get_oauth_token
result = get_oauth_token(
host="gizmosql.example.com",
port=31339, # OAuth HTTP port (default)
tls_skip_verify=True, # Skip TLS cert verification
timeout=300, # Seconds to wait for user to complete auth
)
print(f"Token: {result.token}")
print(f"Session: {result.session_uuid}")
Bulk ingest (load Arrow data into a table)
The ADBC adbc_ingest method on the cursor lets you load Arrow tables,
record batches, or record batch readers directly into GizmoSQL — no
row-by-row INSERT needed:
import pyarrow as pa
from adbc_driver_gizmosql import dbapi as gizmosql
# Build an Arrow table
table = pa.table({
"id": [1, 2, 3],
"name": ["Alice", "Bob", "Charlie"],
"score": [95.0, 87.5, 91.2],
})
with gizmosql.connect("gizmosql://localhost:31337",
username="gizmosql_user",
password="gizmosql_password",
tls_skip_verify=True,
) as conn:
with conn.cursor() as cur:
# Create a new table and insert the data
cur.adbc_ingest("students", table, mode="create")
# Verify
cur.execute("SELECT * FROM students")
print(cur.fetch_arrow_table())
Supported modes: "create", "append", "replace", "create_append".
Data containing geoarrow.* extension columns (as produced by fetching
GizmoSQL GEOMETRY columns) round-trips with the geometry type
preserved — in every mode.
Observability: OpenTelemetry tracing & logging
The driver emits OpenTelemetry trace spans
for the core operations — Database.Open, Prepare, ExecuteQuery,
and ExecuteUpdate — and supports structured logging.
Tracing
Enable a trace exporter via db_kwargs (per-connection) or the standard
OTEL_* environment variables (process-wide):
from adbc_driver_gizmosql import dbapi as gizmosql
with gizmosql.connect("gizmosql://localhost:31337",
username="gizmosql_user",
password="gizmosql_password",
tls_skip_verify=True,
db_kwargs={
# one of: none | otlp | console | adbcfile
"adbc.telemetry.traces_exporter": "otlp",
},
) as conn:
...
Option key (db_kwargs) |
Description |
|---|---|
adbc.telemetry.traces_exporter |
Exporter: none, otlp, console, or adbcfile |
adbc.telemetry.traces_folder_path |
Output directory when using the adbcfile exporter |
adbc.telemetry.trace_parent |
W3C Trace Context traceparent — join your application's existing distributed trace |
With the otlp exporter, the standard OpenTelemetry environment
variables (OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_EXPORTER_OTLP_HEADERS,
...) configure the collector endpoint. OTEL_TRACES_EXPORTER may also
be used instead of the database option (the option wins when both are
set).
Driver logging
Set the log level for the underlying Flight SQL driver via an environment variable (great for debugging connection/TLS/auth issues):
export ADBC_DRIVER_FLIGHTSQL_LOG_LEVEL=debug # debug | info | warn | error
Pandas integration
import pandas as pd
from adbc_driver_gizmosql import dbapi as gizmosql
with gizmosql.connect("gizmosql://localhost:31337",
username="gizmosql_user",
password="gizmosql_password",
tls_skip_verify=True,
) as conn:
df = pd.read_sql("SELECT * FROM nation ORDER BY n_nationkey", conn)
print(df)
API Reference
dbapi.connect()
| Parameter | Type | Default | Description |
|---|---|---|---|
uri |
str |
None |
Server URI (e.g., "gizmosql://host:31337" — TLS by default; grpc+tls://, grpc+tcp://, and flightsql:// also accepted); optional if profile supplies it. "profile://<name>" is also accepted |
profile |
str |
None |
ADBC connection profile — a bare name resolved via the standard search paths (incl. ADBC_PROFILE_PATH) or an absolute path to a .toml file. At least one of uri/profile is required |
username |
str |
None |
Username for password auth |
password |
str |
None |
Password for password auth |
tls_skip_verify |
bool |
False |
Skip TLS cert verification |
auth_type |
str |
"password" |
"password" or "external" (OAuth) |
oauth_port |
int |
31339 |
OAuth HTTP server port |
oauth_url |
str |
None |
Explicit OAuth base URL |
oauth_tls_skip_verify |
bool |
None |
TLS skip for OAuth (defaults to tls_skip_verify) |
oauth_timeout |
int |
300 |
Seconds to wait for OAuth |
open_browser |
bool |
True |
Auto-open browser for OAuth |
catalog |
str |
None |
Catalog (DuckDB database) to make current for the session; must already be attached on the server. Shorthand for conn_kwargs={"adbc.connection.catalog": ...} |
db_schema |
str |
None |
Schema to make current for the session. Shorthand for conn_kwargs={"adbc.connection.db_schema": ...} |
db_kwargs |
dict |
None |
Extra ADBC database options |
conn_kwargs |
dict |
None |
Extra ADBC connection options |
autocommit |
bool |
True |
Enable autocommit |
cursor.execute_update()
Execute a DDL/DML statement immediately and return the rows-affected
count. This is an alternative to cursor.execute() when you need the
rows-affected count as the return value.
| Parameter | Type | Default | Description |
|---|---|---|---|
query |
str |
required | SQL DDL or DML statement to execute |
Returns: int — number of rows affected (0 for DDL statements that do
not affect rows)
Note:
cursor.execute()auto-detects DDL/DML and executes it immediately, soexecute_update()is only needed when you want the rows-affected count returned directly. The module-levelgizmosql.execute_update(cursor, query)function is still available for backward compatibility.
get_oauth_token()
| Parameter | Type | Default | Description |
|---|---|---|---|
host |
str |
required | GizmoSQL server hostname |
port |
int |
31339 |
OAuth HTTP port |
tls_skip_verify |
bool |
True |
Skip TLS cert verification |
timeout |
int |
300 |
Seconds to wait |
poll_interval |
float |
1 |
Seconds between polls |
open_browser |
bool |
True |
Auto-open browser |
oauth_url |
str |
None |
Explicit OAuth base URL |
Returns: OAuthResult(token=str, session_uuid=str)
How the OAuth flow works
Python Client GizmoSQL OAuth Server Identity Provider
| | |
+-- GET /oauth/initiate ---->| |
|<-- {uuid, auth_url} -------| |
| | |
+-- Open browser to auth_url-|--------------------------->|
| | |
| |<-- callback (auth code) ---|
| |-- exchange code for token ->|
| |<-- id_token ---------------|
| | |
+-- GET /oauth/token/{uuid}->| |
|<-- {status: complete, | |
| token: <id_token>} | |
| | |
+-- Flight BasicAuth ------->| |
| user="token" | (verify token via JWKS, |
| pass=<id_token> | issue server JWT) |
|<-- Server Bearer token ----| |
Under the hood
The wheel bundles libadbc_driver_gizmosql, a native driver written in
Go on top of apache/arrow-adbc's
Flight SQL driver, loaded via adbc-driver-manager. The same library is
usable from Go, R, C/C++, C#, Rust, and JavaScript — see the
repository README for
non-Python usage. To point at a custom driver build, set
GIZMOSQL_DRIVER_LIB=/path/to/libadbc_driver_gizmosql.<ext>.
Upgrading from the 1.x pure-Python driver? The API is byte-compatible — see the migration guide.
License
Apache License 2.0 — see LICENSE.
Metadata
Release files for adbc-driver-gizmosql 2.0.14
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| adbc_driver_gizmosql-2.0.14-py3-none-win_arm64.whl | Python 3 | none | Windows ARM64 | Details |
| adbc_driver_gizmosql-2.0.14-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details |
| adbc_driver_gizmosql-2.0.14-py3-none-manylinux_2_34_x86_64.whl | Python 3 | none | Linux glibc 2.34+ x86-64 | Details |
| adbc_driver_gizmosql-2.0.14-py3-none-manylinux_2_34_aarch64.whl | Python 3 | none | Linux glibc 2.34+ ARM64 | Details |
| adbc_driver_gizmosql-2.0.14-py3-none-macosx_11_0_x86_64.whl | Python 3 | none | macOS 11.0+ x86-64 | Details |
| adbc_driver_gizmosql-2.0.14-py3-none-macosx_11_0_universal2.whl | Python 3 | none | macOS 11.0+ universal2 (ARM64, x86-64) | Details |
Total release size: 74.2 MB
Release files / adbc_driver_gizmosql-2.0.14-py3-none-win_arm64.whl
| Download URL | adbc_driver_gizmosql-2.0.14-py3-none-win_arm64.whl |
|---|---|
| Size | 13.7 MB |
| Tags | Python 3 Windows ARM64 |
|
SHA-256 checksum How to use checksums |
c211b204c48ae2d95fb662bfc1e40e7f9927282be9a0e1f76bf7aece65b78a09
|
|
BLAKE2b-256 checksum How to use checksums |
2ad5405c7ea5322b61795d88741af0c13f349f3e1e059ecbcdace7b6beccd0be
|
| 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 30, 2026.
Transparency logRelease files / adbc_driver_gizmosql-2.0.14-py3-none-win_amd64.whl
| Download URL | adbc_driver_gizmosql-2.0.14-py3-none-win_amd64.whl |
|---|---|
| Size | 15.1 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
0d84c2247ba22456978471dbe4a1dd3958b5926eb05f9fa42d7c6a54018c4ed3
|
|
BLAKE2b-256 checksum How to use checksums |
be6a8e666f668e77485ba90de733a6b078dcb62e31ddec20eece22b588eed869
|
| 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 30, 2026.
Transparency logRelease files / adbc_driver_gizmosql-2.0.14-py3-none-manylinux_2_34_x86_64.whl
| Download URL | adbc_driver_gizmosql-2.0.14-py3-none-manylinux_2_34_x86_64.whl |
|---|---|
| Size | 15.3 MB |
| Tags | Linux glibc 2.34+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
814f63065f07c78c73161c70774aa1e74d7281813d20f6ae1ed02612c19b9981
|
|
BLAKE2b-256 checksum How to use checksums |
64bd9355d81fc5f10526b3b9aa9fca1b22f1bc4d404482e4629678a3135653b9
|
| 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 30, 2026.
Transparency logRelease files / adbc_driver_gizmosql-2.0.14-py3-none-manylinux_2_34_aarch64.whl
| Download URL | adbc_driver_gizmosql-2.0.14-py3-none-manylinux_2_34_aarch64.whl |
|---|---|
| Size | 14.0 MB |
| Tags | Linux glibc 2.34+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
0cbdf96629295f49a44d611ff7ac9641b1b63b9dffb698623e578b62b5af0c02
|
|
BLAKE2b-256 checksum How to use checksums |
6812838dc634d0e3c271cfb810a5f4058f99dcd14dae8c9b2270d7c56c18e42f
|
| 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 30, 2026.
Transparency logRelease files / adbc_driver_gizmosql-2.0.14-py3-none-macosx_11_0_x86_64.whl
| Download URL | adbc_driver_gizmosql-2.0.14-py3-none-macosx_11_0_x86_64.whl |
|---|---|
| Size | 8.4 MB |
| Tags | Python 3 macOS 11.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
0ad24d142a5126cb2df78e5d1f313eb0e6259f7ad1b816661e08ead4dd074524
|
|
BLAKE2b-256 checksum How to use checksums |
59e271ed4a5f2375a53fe2e6c2c50d9ab5c34455bc4f7ea8353497e8fb5a1c85
|
| 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 30, 2026.
Transparency logRelease files / adbc_driver_gizmosql-2.0.14-py3-none-macosx_11_0_universal2.whl
| Download URL | adbc_driver_gizmosql-2.0.14-py3-none-macosx_11_0_universal2.whl |
|---|---|
| Size | 7.7 MB |
| Tags | Python 3 macOS 11.0+ universal2 (ARM64, x86-64) |
|
SHA-256 checksum How to use checksums |
e78206fde6971b5d729472548c22add2562502e4c9432f6d55ae412357b61332
|
|
BLAKE2b-256 checksum How to use checksums |
03a8d7457ed7a7e4eb73e141ee6110ea0729a804fc62268d32364db919292c64
|
| 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 30, 2026.
Transparency log