Skip to main content

Python wrapper that runs a GizmoSQL Flight SQL server as a subprocess (download-on-first-use, no compilation).

Project description

gizmosql

Run a GizmoSQL Flight SQL server as a managed subprocess from Python — no compile toolchain required, no ahead-of-time install step. The matching gizmosql_server binary is downloaded from GitHub Releases on first use and cached under ~/.cache/gizmosql/.

PyPI version Python versions Downloads License CI

Why?

GizmoSQL is a network endpoint — Apache Arrow Flight SQL on top of DuckDB. The point of running it from Python isn't to talk to it from the same process (the duckdb package is better at that), it's to expose a SQL endpoint to other things:

  • pytest fixtures that exercise a real Flight SQL server in CI
  • Multi-tool / multi-agent workflows where the Python process is the orchestrator and other tools (a JDBC driver, Power BI, AI agents, a separate worker) all connect to the same server
  • Notebook demos that need a live server while showing client-side code
  • "Expose this DuckDB file to the network" — three lines of Python and any Flight SQL client can query it

Install

pip install gizmosql
# or, with the optional ADBC client for Server.connect():
pip install 'gizmosql[adbc]'

The package itself has zero runtime dependencies. The gizmosql_server binary is fetched on first use (~10 MB compressed); subsequent starts use the cached copy.

Quick start

import gizmosql

with gizmosql.Server(password="tiger") as srv:
    print(srv.url)            # grpc+tcp://127.0.0.1:42173
    print(srv.username, srv.password)
    # ... point any Flight SQL client at srv.url ...

The context manager:

  1. Downloads the matching server binary on first use.
  2. Picks a free TCP port (so multiple parallel test workers don't collide).
  3. Starts the subprocess and blocks until it's accepting connections.
  4. SIGTERMs it on exit, escalating to SIGKILL if it doesn't respond.

From the same Python process (optional)

With the adbc extra, you can also query the server from the same Python that started it:

import gizmosql

with gizmosql.Server(password="tiger") as srv:
    with srv.connect() as conn, conn.cursor() as cur:
        cur.execute("SELECT GIZMOSQL_VERSION(), GIZMOSQL_EDITION()")
        print(cur.fetchall())

Common configurations

# Persistent on-disk database with the TPC-H sample loaded at startup.
gizmosql.Server(
    password="tiger",
    database_filename="warehouse.duckdb",
    init_sql_commands="CALL dbgen(sf=1);",  # ~1 GB on disk
)

# Pin the LTS channel (DuckDB LTS release).
gizmosql.Server(password="tiger", channel="lts")

# Pin a specific version (overrides the package's default version).
gizmosql.Server(password="tiger", version="v1.25.1")

# Listen on all interfaces (default is loopback only).
gizmosql.Server(password="tiger", host="0.0.0.0")

# Forward arbitrary CLI flags to gizmosql_server.
gizmosql.Server(
    password="tiger",
    extra_args=["--print-queries", "--query-log-level", "debug"],
)

See gizmosql_server --help (in the cached binary) for the full set of CLI flags — anything passed via extra_args is forwarded verbatim.

Versioning

gizmosql==X.Y.Z ships in lock-step with the matching GizmoSQL server tag vX.Y.Z — that's the version it'll download and run unless you override with version="...". Python-only patches (rare) use PEP 440 .postN suffixes, e.g. 1.25.1.post1.

pytest fixture pattern

# conftest.py
import pytest
import gizmosql

@pytest.fixture(scope="session")
def gizmosql_server(tmp_path_factory):
    db = tmp_path_factory.mktemp("gizmosql") / "test.duckdb"
    with gizmosql.Server(password="testpw", database_filename=str(db)) as srv:
        yield srv
# test_my_app.py
def test_my_jdbc_client_can_query(gizmosql_server):
    # Hand srv.url to whatever client you're testing.
    my_client.connect(gizmosql_server.url, "gizmosql", "testpw")
    ...

The session scope reuses the server across the whole run; ports are auto-picked, so parallel pytest-xdist workers don't collide.

Environment variables

Variable Purpose
GIZMOSQL_CACHE_DIR Override the binary cache root (default: ~/.cache/gizmosql/ on POSIX, %LOCALAPPDATA%\gizmosql\Cache on Windows).
GIZMOSQL_VERSION Default server version when Server(version=...) is unset.
GIZMOSQL_RELEASE_REPO GitHub repo to download releases from (default gizmodata/gizmosql).
GIZMOSQL_RELEASE_BASE_URL Full base URL override; for testing against a staging release page.

Limitations

  • Subprocess only (no in-process / FFI mode in v1). The server runs in its own process and clients (including Server.connect()) talk to it over the loopback Flight SQL endpoint. This is the right architecture for the intended use cases — see Why? above.
  • Pre-built binaries exist for: macOS arm64, Linux amd64, Linux arm64, Windows amd64. Other platforms aren't supported.

Links

License

Apache-2.0, matching the main GizmoSQL project.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

gizmosql-1.25.1.tar.gz (15.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

gizmosql-1.25.1-py3-none-any.whl (14.3 kB view details)

Uploaded Python 3

File details

Details for the file gizmosql-1.25.1.tar.gz.

File metadata

  • Download URL: gizmosql-1.25.1.tar.gz
  • Upload date:
  • Size: 15.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for gizmosql-1.25.1.tar.gz
Algorithm Hash digest
SHA256 7a5afff8b6f706f5ab522138ca7543ab7f8d916f982e1755dd4216550fb410e8
MD5 8bd2ee97b539a042434987d17dc2f092
BLAKE2b-256 e70f7a4dcad7186c220e4993afeadb8d01fa5c1b41786f36ddc574e57bf8451d

See more details on using hashes here.

Provenance

The following attestation bundles were made for gizmosql-1.25.1.tar.gz:

Publisher: ci.yml on gizmodata/gizmosql-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file gizmosql-1.25.1-py3-none-any.whl.

File metadata

  • Download URL: gizmosql-1.25.1-py3-none-any.whl
  • Upload date:
  • Size: 14.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for gizmosql-1.25.1-py3-none-any.whl
Algorithm Hash digest
SHA256 888d9cd04f659dc36ca13593d4283e53ae5b092bc83afc614cf28ed122122cb8
MD5 7c73d7b0477c15f74c69cc927fdc6c6d
BLAKE2b-256 726abdf77e8e89bd76c1687470dca09bc68a0f982c8d5101ef255f43dc1e97ee

See more details on using hashes here.

Provenance

The following attestation bundles were made for gizmosql-1.25.1-py3-none-any.whl:

Publisher: ci.yml on gizmodata/gizmosql-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page