Skip to main content

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, Windows arm64. Other platforms aren't supported.

Links

License

Apache-2.0, matching the main GizmoSQL project.

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.33.0.tar.gz (16.5 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.33.0-py3-none-any.whl (14.8 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for gizmosql-1.33.0.tar.gz
Algorithm Hash digest
SHA256 46d7ea93cdcbd4707d875cbfcb364914122c54b37f215128e31aec0b19533479
MD5 154644ec22d768d8d552cb7b4bed2f4b
BLAKE2b-256 57bed73a57425942eee86c1b1c81137e53729a4467ac6e59f0215e77fea16379

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: gizmosql-1.33.0-py3-none-any.whl
  • Upload date:
  • Size: 14.8 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.33.0-py3-none-any.whl
Algorithm Hash digest
SHA256 682de8abcf322d76970654a11ae65e0c45daa6f8bc56361cf2c91c7b1385dfae
MD5 2fc770f70bc82902522559e86c9780de
BLAKE2b-256 9cb69cb784ae636237bdd1b083d73a499681960a10b9b3017774e6e74711d292

See more details on using hashes here.

Provenance

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

Release history Release notifications | RSS feed

1.36.0

2 files

1.35.1.post1

2 files

1.35.1

2 files

1.35.0

2 files

1.34.1

2 files

1.34.0

2 files

This release

1.33.0 This release

2 files

1.32.0.post1

2 files

1.32.0

2 files

1.31.1

2 files

1.31.0

2 files

1.30.2

2 files

1.30.1

2 files

1.30.0

2 files

1.29.0

2 files

1.28.0

2 files

1.27.1

2 files

1.27.0

2 files

1.26.3

2 files

1.26.2

2 files

1.26.0

2 files

1.25.2

2 files

1.25.1

2 files

Supported by

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