a pipe for quackheads
๐ค quackpype
QuackPy is a serverless OLAP API built on top of DuckDB exposing HTTP/S and Arrow Flight SQL interfaces
Important
- Easy HTTP API with multiple formats (JSON,CSV,Parquet)
- Powerful Arrow Flight API for modern data clients
- Unlocked Concurrent inserts and querying on DuckDB
- Persistent storage using w/ multiuser authentication
- Native access to any DuckDB Extension & Format
- Embedded SQL Query Interface for instant usage
Run using docker or build from source
docker pull ghcr.io/quackscience/quackpy:latest
docker run -ti --rm -p 8123:8123 -p 8815:8815 ghcr.io/quackscience/quackpy:latest
See the Examples directory for quick starters
Note
Quackpipe executes queries in :memory:
unless authentication details are provided for data persistence
Execute DuckDB queries using the HTTP POST/GET API (compatible with the ClickHouse HTTP API)
curl -X POST "http://user:persistence@localhost:8123" \
-H "Content-Type: application/json" \
-d 'SELECT version()'
Execute DuckDB queries using the experimental Flight GRPC API and Airport
Note
Quackpipe executes queries in :memory:
unless an authorization
header is provided for data persistence
D SELECT * FROM airport_take_flight('grpc://localhost:8815', 'SELECT 1', headers := MAP{'authorization':'user:password'} );
โโโโโโโโโ
โ 1 โ
โ int32 โ
โโโโโโโโโค
โ 1 โ
โโโโโโโโโ
D select flight_descriptor, endpoint from airport_list_flights('grpc://127.0.0.1:8815', null);
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ flight_descriptor โ endpoint โ
โ union(cmd blob, path varchar[]) โ struct(ticket blob, "location" varchar[], expiration_time timestamp, app_metadata blob)[] โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ show_databases โ [{'ticket': SHOW DATABASES, 'location': [grpc://localhost:8815], 'expiration_time': NULL, 'app_metadata': }] โ
โ show_version โ [{'ticket': SELECT version(), 'location': [grpc://localhost:8815], 'expiration_time': NULL, 'app_metadata': }] โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
D select * from airport_take_flight('grpc://localhost:8815/', ['show_version']);
โโโโโโโโโโโโโโโ
โ "version"() โ
โ varchar โ
โโโโโโโโโโโโโโโค
โ v1.1.3 โ
โโโโโโโโโโโโโโโ
from pyarrow.flight import FlightClient, Ticket, FlightCallOptions
import json
import pandas
import tabulate
sql="""SELECT version()"""
flight_ticket = Ticket(sql)
token = (b"authorization", bytes(f"user:persistence".encode('utf-8')))
options = FlightCallOptions(headers=[token])
client = FlightClient(f"grpc://localhost:8815")
reader = client.do_get(flight_ticket, options)
arrow_table = reader.read_all()
# Use pyarrow and pandas to view and analyze data
data_frame = arrow_table.to_pandas()
print(data_frame.to_markdown())
| | "version"() |
|---:|:--------------|
| 0 | v1.1.3 |
quackpy ships with the DuckDB SQL quack user-interface based on ch-ui
sequenceDiagram
participant Client
participant QuackPy
participant DuckDB
Client ->> QuackPy: ListFlights
QuackPy ->> Client: Return Flights Table
Client ->> QuackPy: GetFlightInfo
QuackPy ->> DuckDB: DuckDB Execute
DuckDB ->> QuackPy: Arrow Results Stream
QuackPy ->> Client: FlightInfo(ticket)
Client ->> QuackPy: do_get(ticket)
QuackPy ->> Client: Stream of Results
Footnotes
-
DuckDB ยฎ is a trademark of DuckDB Foundation. All rights reserved by their respective owners. 1 โฉ
-
ClickHouse ยฎ is a trademark of ClickHouse Inc. No direct affiliation or endorsement. 2 โฉ
-
Released under the MIT license. See LICENSE for details. All rights reserved by their respective owners. 3 โฉ
-
Flight implementation inspired by Duck Takes Flight 4 โฉ