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 Docs

📖 Full reference: docs.gizmosql.com/#/python_library — covers all Server() parameters, the pytest fixture pattern, the multi-agent pattern, environment variables, and limitations. This README is a quick tour; the docs page is the authoritative reference.

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.26.0.tar.gz (16.0 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.26.0-py3-none-any.whl (14.4 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for gizmosql-1.26.0.tar.gz
Algorithm Hash digest
SHA256 a2329674fcef3cad076b2e5d93b5b538401b5f05175aec49fb548557625dba70
MD5 0e16359ae2ee67e3c6db9256c7b36315
BLAKE2b-256 7325db9ff2f3403b749c03521eb308ada2bdec34b847da857aeb49d441569bdd

See more details on using hashes here.

Provenance

The following attestation bundles were made for gizmosql-1.26.0.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.26.0-py3-none-any.whl.

File metadata

  • Download URL: gizmosql-1.26.0-py3-none-any.whl
  • Upload date:
  • Size: 14.4 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.26.0-py3-none-any.whl
Algorithm Hash digest
SHA256 596c91d22a0c22af81da1435bfad6acd970bc4fe2655a304e628ab33a71ee4fb
MD5 19abc1a176e96e77cb59977cfe23c152
BLAKE2b-256 66a8abc96d0246f6a5184e6748a9c14f3b6acf70c9fbb9f48acf07061b788444

See more details on using hashes here.

Provenance

The following attestation bundles were made for gizmosql-1.26.0-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