Skip to main content

A SQLAlchemy dialect for connecting to a [GizmoSQL](https://github.com/gizmodata/gizmosql) server with ADBC

Project description

SQLAlchemy GizmoSQL ADBC Dialect

sqlalchemy-gizmosql-adbc-dialect-ci Supported Python Versions PyPI version PyPI Downloads

Basic SQLAlchemy dialect for GizmoSQL

[!NOTE] The term "dialect" is used in SQLAlchemy to refer to a specific database backend. See: https://docs.sqlalchemy.org/en/20/dialects/ for more details. This package uses a DuckDB SQL dialect when sending SQL commmands to the GizmoSQL server.

Installation

Option 1 - from PyPi

$ pip install sqlalchemy-gizmosql-adbc-dialect

Option 2 - from source - for development

git clone https://github.com/gizmodata/sqlalchemy-gizmosql-adbc-dialect

cd sqlalchemy-gizmosql-adbc-dialect

# 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 SQLAlchemy GizmoSQL ADBC Dialect - in editable mode with dev dependencies
pip install --editable .[dev]

Note

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

export PYTHONPATH=$(pwd)/src

Usage

Once you've installed this package, you should be able to just use it, as SQLAlchemy does a python path search

Start a GizmoSQL Server - example below - see https://github.com/gizmodata/GizmoSQL for more details

docker run --name gizmosql \
           --detach \
           --rm \
           --tty \
           --init \
           --publish 31337:31337 \
           --env TLS_ENABLED="1" \
           --env GIZMOSQL_PASSWORD="gizmosql_password" \
           --env PRINT_QUERIES="1" \
           --pull missing \
           gizmodata/gizmosql:latest

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

Connect with the SQLAlchemy GizmoSQL ADBC Dialect

import os
import logging

from sqlalchemy import create_engine, MetaData, Table, select, Column, text, Integer, String, Sequence
from sqlalchemy.orm import Session
from sqlalchemy.orm import declarative_base
from sqlalchemy.engine.url import URL

# Setup logging
logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)


Base = declarative_base()


class FakeModel(Base):  # type: ignore
    __tablename__ = "fake"

    id = Column(Integer, Sequence("fakemodel_id_sequence"), primary_key=True)
    name = Column(String)


def main():
    # Build the URL
    url = URL.create(drivername="gizmosql",
                     host="localhost",
                     port=31337,
                     username=os.getenv("GIZMOSQL_USERNAME", "gizmosql_username"),
                     password=os.getenv("GIZMOSQL_PASSWORD", "gizmosql_password"),
                     query={"disableCertificateVerification": "True",
                            "useEncryption": "True"
                            }
                     )

    print(f"Database URL: {url}")

    engine = create_engine(url=url)
    Base.metadata.create_all(bind=engine)

    metadata = MetaData()
    metadata.reflect(bind=engine)

    for table_name in metadata.tables:
        print(f"Table name: {table_name}")

    with Session(bind=engine) as session:

        # Try ORM
        session.add(FakeModel(id=1, name="Joe"))
        session.commit()

        joe = session.query(FakeModel).filter(FakeModel.name == "Joe").first()

        assert joe.name == "Joe"

        # Execute some raw SQL
        results = session.execute(statement=text("SELECT * FROM fake")).fetchall()
        print(results)

        # Try a SQLAlchemy table select
        fake: Table = metadata.tables["fake"]
        stmt = select(fake.c.name)

        results = session.execute(statement=stmt).fetchall()
        print(results)


if __name__ == "__main__":
    main()

Credits

Much code and inspiration was taken from repo: https://github.com/Mause/duckdb_engine

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

sqlalchemy_gizmosql_adbc_dialect-0.0.26.tar.gz (11.5 kB view details)

Uploaded Source

Built Distribution

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

File details

Details for the file sqlalchemy_gizmosql_adbc_dialect-0.0.26.tar.gz.

File metadata

File hashes

Hashes for sqlalchemy_gizmosql_adbc_dialect-0.0.26.tar.gz
Algorithm Hash digest
SHA256 3bd1265d8c57c124c4574b197bc2e9508f97e409ae49f05aeb06fa9d22ea4610
MD5 ca8b3f1cc0a26e3cb42878a3c3467718
BLAKE2b-256 c3d8ea60616f0b3a896dd7a7624cb0d18902ba49723e924611a5f030b0fe4c27

See more details on using hashes here.

Provenance

The following attestation bundles were made for sqlalchemy_gizmosql_adbc_dialect-0.0.26.tar.gz:

Publisher: ci.yml on gizmodata/sqlalchemy-gizmosql-adbc-dialect

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

File details

Details for the file sqlalchemy_gizmosql_adbc_dialect-0.0.26-py3-none-any.whl.

File metadata

File hashes

Hashes for sqlalchemy_gizmosql_adbc_dialect-0.0.26-py3-none-any.whl
Algorithm Hash digest
SHA256 e2dbb17b30537298c001bf8bd1ce1e75c49f5b4465808a5743568aa0736e195a
MD5 03c8395437153c71dbd84ec4b12b8291
BLAKE2b-256 4693366a6e92391d8d3fe1f3c60527373a71245217f6a3db8e2555d5c950d8f8

See more details on using hashes here.

Provenance

The following attestation bundles were made for sqlalchemy_gizmosql_adbc_dialect-0.0.26-py3-none-any.whl:

Publisher: ci.yml on gizmodata/sqlalchemy-gizmosql-adbc-dialect

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