QuestDB

QuestDB Client Library for Python

This is the official Python client library for QuestDB.

This client library implements the QuestDB Wire Protocol (QWP) over WebSocket for pooled ingestion and queries — the deployment-level questdb.connect() API. A connection-level Sender (one sender = one connection) covers the legacy ILP transports — QuestDB’s variant of the InfluxDB Line Protocol over HTTP and TCP, including HTTP transactions — plus QWP over UDP.

This implementation supports authentication and full-connection encryption with TLS.

Install

The latest version of the library is 5.0.0 (changelog).

python3 -m pip install -U questdb[dataframe]

Quickstart

Start by setting up QuestDB . Once set up, you can use this library to insert data.

The most common way to insert data is from a Pandas dataframe.

import numpy as np
import pandas as pd
import questdb

df = pd.DataFrame({
    'symbol': pd.Categorical(['ETH-USD', 'BTC-USD']),
    'side': pd.Categorical(['sell', 'sell']),
    'price': [2615.54, 39269.98],
    'amount': [0.00044, 0.001],

    # NumPy float64 arrays require QuestDB server >= 9.0.0.
    'ord_book_bids': [
        np.array([2615.54, 2618.63]),
        np.array([39269.98, 39270.00])
    ],

    'timestamp': pd.to_datetime(['2021-01-01', '2021-01-02'])})

conf = 'ws::addr=localhost:9000;'
with questdb.connect(conf) as db:
    db.dataframe(df, table_name='trades', at='timestamp')

You can also send individual rows. This only requires a more minimal installation:

python3 -m pip install -U questdb
import numpy as np
import questdb
from questdb import TimestampNanos

conf = 'ws::addr=localhost:9000;'
with questdb.connect(conf) as db:
    with db.sender() as sender:
        sender.row(
            'trades',
            symbols={'symbol': 'ETH-USD', 'side': 'sell'},
            columns={
                'price': 2615.54,
                'amount': 0.00044,

                # NumPy float64 arrays require QuestDB server >= 9.0.0.
                'ord_book_bids': np.array([2615.54, 2618.63]),
            },
            at=TimestampNanos.now())
        sender.flush(wait=True)

questdb.connect() addresses a whole deployment through connection pools. For connection-level needs — ILP/HTTP transactions, QWP/UDP datagrams, ILP/TCP — use the standalone Sender, where one sender drives one connection. Set the configuration string to the transport you need:

from questdb import Sender

conf = 'http::addr=localhost:9000;'
with Sender.from_conf(conf) as sender:
    ...

See the 5.0 migration guide when moving existing code to 5.0: questdb.connect() is the new QWP/WebSocket entry point, DataFrame bulk loads over QWP/WebSocket go through QuestDB.dataframe(), and the 4.x questdb.ingress import location is now a deprecated compatibility shim.

You can continue by reading the Sending Data Over ILP guide.

Community

Stop by our Community Forum to chat with the QuestDB team.

You can also sign up to our mailing list to get notified of new releases.

License

The code is released under the Apache License 2.0.

Contents

Indices and tables