Skip to main content

Polnor Python SDK — query Iceberg lakehouses, manage notebooks/jobs/models, MLflow-compatible tracking.

Project description

Polnor Python SDK

The official Python client for the Polnor lakehouse — query Iceberg tables with SQL, manage notebooks / jobs / models / endpoints, read & write pandas DataFrames, and use the PEP 249 driver for dbt, pandas, sqlalchemy, and any tool that speaks standard Python DB API.

Install

pip install polnor

Quick start

import polnor

# `polnor.sql()` runs against your default warehouse. Inside a Polnor
# notebook or job, credentials are injected automatically. On a laptop,
# set env vars first (see "Auth" below).
result = polnor.sql("SELECT * FROM demo.orders LIMIT 5")
print(result.rows)            # list of lists
print(result.to_pandas())     # pandas DataFrame

Auth

The SDK resolves credentials in this order (first match wins):

  1. polnor.set_token("...", api_url="...", warehouse_id="...") — explicit call
  2. Environment variables: POLNOR_API_URL, POLNOR_TOKEN, POLNOR_WAREHOUSE_ID
  3. ~/.polnor/config.toml — TOML config file written by the polnor CLI

Inside a Polnor notebook or job, all three POLNOR_ env vars are injected by the runtime* — your cell-1 polnor.sql(...) works with no setup.

Local example (TOML config):

# ~/.polnor/config.toml
host = "https://api.polnor.net"
token = "<personal access token>"
workspace_id = "<your workspace>"
warehouse_id = "<your default warehouse>"

What's in the box

Module What it does
polnor.sql(query) Run SQL on a SQL warehouse, return rows / pandas / dicts.
polnor.warehouses List / get / start / stop / default SQL warehouses.
polnor.compute Manage compute VMs (start, stop, install_library, logs).
polnor.notebooks Create / start / stop Jupyter notebooks on a compute.
polnor.jobs Create + run DAG jobs, fetch logs, cancel, wait.
polnor.models Model registry: versions, artifact URIs, framework tags.
polnor.endpoints Serve a model image: deploy, predict, scale, stop.
polnor.tables Browse databases (Iceberg namespaces) and tables.
polnor.read_pandas Read a table (with where=, limit=) into a DataFrame.
polnor.write_pandas Bulk-insert a DataFrame (append / overwrite / create).
polnor.dbapi PEP 249 driver: connect() / cursor() for dbt / pandas.
polnor.mlflow MLflow-compatible tracking: log_param, log_metric, etc.

Examples

SQL → pandas DataFrame

df = polnor.sql("SELECT region, COUNT(*) c FROM demo.orders GROUP BY region").to_pandas()
df.plot(kind="bar")

Push a DataFrame to a table

import pandas as pd
df = pd.DataFrame({"id": [1, 2, 3], "name": ["alice", "bob", "carol"]})
polnor.write_pandas(df, "polnor.demo.default.users", mode="create")

PEP 249 (works with dbt, pandas.read_sql, sqlalchemy)

import pandas as pd
import polnor.dbapi as dbapi

conn = dbapi.connect()
df = pd.read_sql("SELECT * FROM demo.orders", conn)

Notebooks, jobs, models, endpoints

# Start a notebook on a CPU compute
polnor.compute.start("my-cpu", wait=True)
nb = polnor.notebooks.create(name="explore", compute_id="my-cpu")
polnor.notebooks.start("explore", wait=True)

# Run a DAG job
job = polnor.jobs.create(name="etl", tasks=[
    {"key": "extract",   "command": "python extract.py",   "image": "python:3.11"},
    {"key": "transform", "command": "python transform.py", "image": "python:3.11",
     "depends_on": ["extract"]},
])
run_id = polnor.jobs.run("etl")
polnor.jobs.wait(run_id)
print(polnor.jobs.logs(run_id))

# Serve a model
polnor.endpoints.create(name="fraud-v1", image="my-registry/fraud:1.0",
                        environment={"CONTAINER_PORT": "8080"})
polnor.endpoints.deploy("fraud-v1", wait=True)
pred = polnor.endpoints.predict("fraud-v1", inputs=[[0.1, 0.2, 0.3]])

MLflow-compatible tracking

from polnor import mlflow
with mlflow.start_run() as run:
    mlflow.log_param("lr", 0.01)
    mlflow.log_metric("accuracy", 0.93)
    mlflow.log_artifact("./model.pkl")

Errors

The SDK raises these typed exceptions:

  • polnor.PolnorAPIError — non-2xx HTTP from the control plane.
  • polnor.SQLError — statement failed, cancelled, or timed out.
  • polnor.PolnorConfigError — no credentials could be resolved.
  • polnor.dbapi.ProgrammingError / OperationalError / etc. — PEP 249 hierarchy.

Compatibility

  • Python ≥ 3.9 (tomli falls in for 3.9 / 3.10; 3.11+ has tomllib built in)
  • pandas integration: optional, lazily imported
  • dbt: works via polnor.dbapi (a dedicated dbt-polnor adapter is in V2)

Development

pip install -e ".[test]"
pytest

Tests use responses to mock HTTP — no live API needed. The tests/test_e2e_prod.py suite (opt-in via env) hits api.polnor.net and requires a running warehouse + valid PAT.

Links

License

Apache-2.0.

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

polnor-1.3.0.tar.gz (50.0 kB view details)

Uploaded Source

Built Distribution

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

polnor-1.3.0-py3-none-any.whl (49.1 kB view details)

Uploaded Python 3

File details

Details for the file polnor-1.3.0.tar.gz.

File metadata

  • Download URL: polnor-1.3.0.tar.gz
  • Upload date:
  • Size: 50.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.12

File hashes

Hashes for polnor-1.3.0.tar.gz
Algorithm Hash digest
SHA256 c9bfafff1debb497d3890533d25726a88132cc0156fa10535886b9158dfba29c
MD5 5d7cc90182331ed0fd19fcb61d5ce60e
BLAKE2b-256 766163d1e908686a65febe35cb3f505e8f741bc12639a34db0f3d5fcd14fe406

See more details on using hashes here.

File details

Details for the file polnor-1.3.0-py3-none-any.whl.

File metadata

  • Download URL: polnor-1.3.0-py3-none-any.whl
  • Upload date:
  • Size: 49.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.12

File hashes

Hashes for polnor-1.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 13260d82d40a793f4dc0b11f1ba4b9a39cee39993a28951a672364716bb56504
MD5 8f560cd2b7a2402114718fe02e78786c
BLAKE2b-256 d0a2afdfcae777b678873a7640fda4c8ad0db6a486a44857aae62bacb1d2d63c

See more details on using hashes here.

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