Python client for Mill data services — connect via gRPC or HTTP, query, and consume results as native Python, Arrow, pandas, or polars.
Project description
mill-py (PyPI: qpointz-mill-py)
Python client for Mill data services.
Connect via gRPC or HTTP (JSON / Protobuf), query data with SQL, and consume results as native Python dicts, PyArrow Tables, pandas DataFrames, or polars DataFrames.
Installation
pip install qpointz-mill-py # core (gRPC + HTTP)
pip install qpointz-mill-py[arrow] # + PyArrow support
pip install qpointz-mill-py[pandas] # + pandas (includes Arrow)
pip install qpointz-mill-py[polars] # + polars (includes Arrow)
pip install qpointz-mill-py[all] # everything
Requirements: Python 3.10 – 3.13.
Quick Start
from mill import connect
# Connect via gRPC
client = connect("grpc://localhost:9090")
# List schemas
for name in client.list_schemas():
print(name)
# Run a query
result = client.query('SELECT "ID", "CITY" FROM "skymill"."CITIES"')
for row in result:
print(row["CITY"])
Connect via HTTP
# HTTP with JSON encoding (default)
client = connect("http://localhost:8080/services/jet")
# HTTP with protobuf encoding (more efficient)
client = connect("http://localhost:8080/services/jet", encoding="protobuf")
Context Manager
with connect("grpc://localhost:9090") as client:
result = client.query("SELECT 1")
print(result.fetchall())
Authentication
from mill import connect
from mill.auth import BasicAuth, BearerToken
# Basic auth (username + password)
client = connect("grpc://localhost:9090", auth=BasicAuth("user", "pass"))
# Bearer token (OAuth2 / JWT)
client = connect("grpc://localhost:9090", auth=BearerToken("eyJhbG..."))
# Anonymous (default — no auth header)
client = connect("grpc://localhost:9090")
TLS / Mutual-TLS
# TLS with custom CA certificate
client = connect("grpcs://secure.backend:443", tls_ca="/path/to/ca.pem")
# Mutual-TLS (client certificate + key)
client = connect(
"grpcs://mtls.backend:443",
tls_ca="/path/to/ca.pem",
tls_cert="/path/to/client.pem",
tls_key="/path/to/client-key.pem",
)
DataFrame Conversion
All DataFrame conversions use PyArrow as the foundation.
result = client.query('SELECT * FROM "skymill"."CITIES"')
# PyArrow Table
table = result.to_arrow() # requires qpointz-mill-py[arrow]
# pandas DataFrame
df = result.to_pandas() # requires qpointz-mill-py[pandas]
# polars DataFrame
df = result.to_polars() # requires qpointz-mill-py[polars]
Async API
The mill.aio module mirrors the synchronous API with async/await.
from mill.aio import connect as aconnect
from mill.auth import BasicAuth
async with await aconnect("grpc://localhost:9090") as client:
schemas = await client.list_schemas()
result = await client.query('SELECT * FROM "skymill"."CITIES"')
async for row in result:
print(row["CITY"])
# DataFrame conversion
df = await result.to_pandas()
Schema Introspection
client = connect("grpc://localhost:9090")
# List schema names
schemas = client.list_schemas()
# Get full schema with tables and fields
schema = client.get_schema("skymill")
for table in schema.tables:
print(f"{table.schema_name}.{table.name}")
for field in table.fields:
print(f" {field.name}: {field.type.name} (nullable={field.nullable})")
Mill Type System
mill-py supports all 16 Mill logical types with automatic conversion to Python native types:
| Mill Type | Python Type | PyArrow Type |
|---|---|---|
TINY_INT |
int |
int8 |
SMALL_INT |
int |
int16 |
INT |
int |
int32 |
BIG_INT |
int |
int64 |
BOOL |
bool |
bool_ |
FLOAT |
float |
float32 |
DOUBLE |
float |
float64 |
STRING |
str |
string |
BINARY |
bytes |
binary |
UUID |
uuid.UUID |
binary(16) |
DATE |
datetime.date |
date32 |
TIME |
datetime.time |
time64('ns') |
TIMESTAMP |
datetime.datetime |
timestamp('ms') |
TIMESTAMP_TZ |
datetime.datetime (UTC) |
timestamp('ms', tz='UTC') |
INTERVAL_DAY |
datetime.timedelta |
duration('s') |
INTERVAL_YEAR |
int |
int32 |
Error Handling
from mill import connect, MillConnectionError, MillAuthError, MillQueryError
try:
client = connect("grpc://localhost:9090")
result = client.query("SELECT bad syntax")
except MillConnectionError:
print("Cannot reach the server")
except MillAuthError:
print("Authentication failed")
except MillQueryError as e:
print(f"Query failed: {e}")
License
Apache License 2.0. See LICENSE for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file qpointz_mill_py-0.6.2.tar.gz.
File metadata
- Download URL: qpointz_mill_py-0.6.2.tar.gz
- Upload date:
- Size: 78.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.3.2 CPython/3.13.12 Linux/5.15.0-171-generic
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7a3796928f347a17222276d2b94aa805230a1a3da55e80d4463ad93af0fa0c73
|
|
| MD5 |
263c0b88b30245d8fd561ffb28a74d08
|
|
| BLAKE2b-256 |
48a2cd7c95cc4e31c1601c9b605279917c8932c6911fe95863901c01ac5bdbfc
|
File details
Details for the file qpointz_mill_py-0.6.2-py3-none-any.whl.
File metadata
- Download URL: qpointz_mill_py-0.6.2-py3-none-any.whl
- Upload date:
- Size: 115.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.3.2 CPython/3.13.12 Linux/5.15.0-171-generic
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a67707afe6db5b8fbf389f0acee8ce4848b9ff3f38d28fa64ff2c000cc69767c
|
|
| MD5 |
a2ae442ff31632ae69a42a0234d8f10b
|
|
| BLAKE2b-256 |
595ad76b906ac04f954306a8ee1b0187827ed9d645305118635b226f1e6db36f
|