Skip to main content

An Ibis backend for GizmoSQL

Project description

ibis-gizmosql

An Ibis back-end for GizmoSQL

ibis-gizmosql-ci Supported Python Versions PyPI version PyPI Downloads

Setup (to run locally)

Install Python package

You can install ibis-gizmosql from PyPi or from source.

Option 1 - from PyPi

# Create the virtual environment
python3 -m venv .venv

# Activate the virtual environment
. .venv/bin/activate

pip install ibis-gizmosql

Option 2 - from source - for development

git clone https://github.com/gizmodata/ibis-gizmosql

cd ibis-gizmosql

# Create the virtual environment
python3 -m venv .venv

# Activate the virtual environment
. .venv/bin/activate

# Upgrade pip, setuptools, and wheel
pip install --upgrade pip setuptools wheel

# Install the Ibis GizmoSQL back-end - in editable mode with client and dev dependencies
pip install --editable .[dev,test]

Note

For the following commands - if you running from source and using --editable mode (for development purposes) - you will need to set the PYTHONPATH environment variable as follows:

export PYTHONPATH=$(pwd)/ibis_gizmosql

Usage

In this example - we'll start a GizmoSQL server with the DuckDB back-end in Docker, and connect to it from Python using Ibis.

First - start the GizmoSQL server - which by default mounts an empty in-memory database. We use the INIT_SQL_COMMANDS env var in the docker command to create a very small TPC-H database upon startup:

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 PRINT_QUERIES="1" \
           --env DATABASE_FILENAME=":memory:" \
           --env INIT_SQL_COMMANDS="CALL dbgen(sf=0.01);" \
           --pull always \
           gizmodata/gizmosql:latest

[!IMPORTANT] The GizmoSQL server must be started with the DuckDB (default) back-end. The SQLite back-end is not supported.

Next - connect to the GizmoSQL server from Python using Ibis by running this Python code:

import os
import ibis
from ibis import _

# Kwarg connection example
con = ibis.gizmosql.connect(host="localhost",
                            user=os.getenv("GIZMOSQL_USERNAME", "gizmosql_user"),
                            password=os.getenv("GIZMOSQL_PASSWORD", "gizmosql_password"),
                            port=31337,
                            use_encryption=True,
                            disable_certificate_verification=True
                            )

# URL connection example
# con = ibis.connect("gizmosql://gizmosql_user:gizmosql_password@localhost:31337?disableCertificateVerification=True&useEncryption=True")

# OAuth/SSO connection example (no username/password needed)
# con = ibis.gizmosql.connect(host="gizmosql.example.com",
#                             port=31337,
#                             auth_type="external",
#                             use_encryption=True,
#                             disable_certificate_verification=True
#                             )

print(con.tables)

# assign the LINEITEM table to variable t (an Ibis table object)
t = con.table('lineitem')

# use the Ibis dataframe API to run TPC-H query 1
results = (t.filter(_.l_shipdate.cast('date') <= ibis.date('1998-12-01') + ibis.interval(days=90))
       .mutate(discount_price=_.l_extendedprice * (1 - _.l_discount))
       .mutate(charge=_.discount_price * (1 + _.l_tax))
       .group_by([_.l_returnflag,
                  _.l_linestatus
                  ]
                 )
       .aggregate(
            sum_qty=_.l_quantity.sum(),
            sum_base_price=_.l_extendedprice.sum(),
            sum_disc_price=_.discount_price.sum(),
            sum_charge=_.charge.sum(),
            avg_qty=_.l_quantity.mean(),
            avg_price=_.l_extendedprice.mean(),
            avg_disc=_.l_discount.mean(),
            count_order=_.count()
        )
       .order_by([_.l_returnflag,
                  _.l_linestatus
                  ]
                 )
       )

print(results.execute())

You should see output:

  l_returnflag l_linestatus    sum_qty sum_base_price sum_disc_price     sum_charge avg_qty avg_price avg_disc  count_order
0            A            F  380456.00   532348211.65   505822441.49   526165934.00   25.58  35785.71     0.05        14876
1            N            F    8971.00    12384801.37    11798257.21    12282485.06   25.78  35588.51     0.05          348
2            N            O  765251.00  1072862302.10  1019517788.99  1060424708.62   25.47  35703.76     0.05        30049
3            R            F  381449.00   534594445.35   507996454.41   528524219.36   25.60  35874.01     0.05        14902

OAuth/SSO Authentication

For browser-based OAuth/SSO, use auth_type="external" — no username or password needed:

import ibis

con = ibis.gizmosql.connect(
    host="gizmosql.example.com",
    port=31337,
    auth_type="external",
    use_encryption=True,
    disable_certificate_verification=True,
)

Or via URL:

con = ibis.connect("gizmosql://gizmosql.example.com:31337?authType=external&useEncryption=True&disableCertificateVerification=True")

Additional OAuth parameters:

Parameter URL Param Default Description
auth_type authType "password" Auth type — use "external" for OAuth/SSO
oauth_port oauthPort (driver default) Local port for OAuth callback
oauth_timeout oauthTimeout (driver default) Timeout in seconds for OAuth flow
open_browser openBrowser (driver default) Whether to auto-open the browser

Handy development commands

Version management

Bump the version of the application - (you must have installed from source with the [dev] extras)
bumpver update --patch

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

ibis_gizmosql-1.0.3.tar.gz (26.1 kB view details)

Uploaded Source

Built Distribution

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

ibis_gizmosql-1.0.3-py3-none-any.whl (21.1 kB view details)

Uploaded Python 3

File details

Details for the file ibis_gizmosql-1.0.3.tar.gz.

File metadata

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

File hashes

Hashes for ibis_gizmosql-1.0.3.tar.gz
Algorithm Hash digest
SHA256 43912e5f07306caff9935c2064b2d87c30bf57e711df1903cddad81b63394050
MD5 504b1156b1ce3bf44b59ec7a79d52cc8
BLAKE2b-256 60b1a8868d28ff267bf4fe637a82e7c59b5f2e94e126debf5e2f0ff6ab3e49d7

See more details on using hashes here.

Provenance

The following attestation bundles were made for ibis_gizmosql-1.0.3.tar.gz:

Publisher: ci.yml on gizmodata/ibis-gizmosql

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

File details

Details for the file ibis_gizmosql-1.0.3-py3-none-any.whl.

File metadata

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

File hashes

Hashes for ibis_gizmosql-1.0.3-py3-none-any.whl
Algorithm Hash digest
SHA256 d457ce4ebdd9b368e1fb3e7a73047e99d6b9bc2390c82ef392502378696a7271
MD5 d0b9d2bc0fc463c692da3c8dee67ed8e
BLAKE2b-256 872726c399228e6eaea0fd35cef5274ac7c6c50f58e3fa238abf0a3e9fef33b3

See more details on using hashes here.

Provenance

The following attestation bundles were made for ibis_gizmosql-1.0.3-py3-none-any.whl:

Publisher: ci.yml on gizmodata/ibis-gizmosql

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