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.2.0.tar.gz (49.8 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.2.0-py3-none-any.whl (48.9 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for polnor-1.2.0.tar.gz
Algorithm Hash digest
SHA256 692c7106eeb0c785c12a0fd66ebe4f1ca2d61bcc3e1d034d0f54c8d2c02f6bf8
MD5 3a475fb4323c78b4e3a93bbc7b21b33d
BLAKE2b-256 cf01aadb0652d5c7c877ecf6d4e82eff1140aaba48b9a421edb2cf721dad4fdd

See more details on using hashes here.

File details

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

File metadata

  • Download URL: polnor-1.2.0-py3-none-any.whl
  • Upload date:
  • Size: 48.9 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.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3340c3d1241389dfc06f860e1fc908fbac2d332df5538145704d16f88f6aac41
MD5 7a972d2f7e3a6549d501cd9ec3c2df27
BLAKE2b-256 76b2cff05342b82309bdbb363e80cff74b5c9d78b0eda9818b741e863efdfe89

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