Skip to main content

Pure Python asyncio connector to KDB

Project description

GitHub Actions Workflow Status PyPI version

aiokdb

Python asyncio connector to KDB. Pure python, so does not depend on the k.h bindings or kdb shared objects, or numpy/pandas. Fully type hinted to comply with PEP-561. No non-core dependencies, and tested on Python 3.8 - 3.12.

Peer review & motivation

qPython is a widely used library for this task and it maps objects to Pandas Dataframes which might be more suitable for the majority of applications.

This library takes a different approach and aims to replicate using the KDB C-library functions, ie. being 100% explicit about KDB types. It was built working from the publicly documented Serialisation Examples and C API for kdb+ pages. Users might also need to be familiar with k.h.

A simple example, using blocking sockets:

from aiokdb.socket import khpu
# run ./q -p 12345 &

h = khpu("localhost", 12345, "kdb:pass")

# if the remote returns a Q Exception, this gets raised here, unless khpu(..., raise_krr=False)
result = h.k("2.0+3.0")

assert result.aF() == 5.0
# raises ValueError: wrong type KF (-9) for aJ
result.aJ()

The result object is a K-like Python object (a KObj), having the usual signed integer type available as result.type. Accessors for the primitive types are prefixed with an a and check at runtime that the accessor is appropriate for the stored type (.aI(), .aJ(), .aH(), .aF() etc.). Atoms store their value to a bytes object irrespective of the type, and encode/decode on demand. Atomic values can be set with (.i(3), .j(12), .ss("hello")).

Arrays are implemented with subtypes that use Python's native arrays module for efficient array types. The MutableSequence arrays are returned using the usual array accessor functions .kI(), .kB(), .kS() etc.

Serialisation is handled by the b9 function, which encodes a KObj to a python bytes, and the d9 function which takes a bytes and returns a KObj.

  • Atoms are created by ka, kb, ku, kg, kh, ki, kj, ke, kf, kc, ks, kt, kd, kz, ktj
  • Lists with ktn and knk
  • Dictionaries with xd and tables with xt.

Python manages garbage collection, so none of the reference counting primitives exist, i.e. k.r and functions r1, r0 and m9, setm.

Asyncio

Both kdb client and server protocols are implemented using asyncio, and can be tested back-to-back. For instance running python -m aiokdb.server and then python -m aiokdb.client will connect together using KDB IPC. However since there is no interpreter (and the default server does not handle any commands) the server will return an nyi error to all queries. To implement a partial protocol for your own application, subclass aiokdb.server.ServerContext and implement on_sync_request(), on_async_message(), and perhaps check_login().

Command Line Interface

Usable command line client support for connecting to a remote KDB instance (using python asyncio, and prompt_toolkit for line editing and history) is built into the package:

$ pip install aiokdb prompt_toolkit
$ ./q -p 12345 &
$ python -m aiokdb.cli --host localhost --port 12345
(eval) > ([s:7 6 0Nj]x:3?0Ng;y:2)
s| x                                    y
-|---------------------------------------
7| 409031f3-b19c-6770-ee84-6e9369c98697 2
6| 52cb20d9-f12c-9963-2829-3c64d8d8cb14 2
 | cddeceef-9ee9-3847-9172-3e3d7ab39b26 2
(eval) > 4 5 6!(`abc`def;til 300;(3 4!`a`b))
4| abc def
5| 0 1 2 ... 297 298 299
6| KDict
(eval) > [ctrl-D]
$

Text formatting above is controlled by aiokdb.format.ASCIIFormatter, which looks inside a KObj to render XD, SD, XT types in tabular form containing atom and vector values. Nested complex types ie. dictionary or table render as KDict or KFlip constant.

QDB Files

Ordinary .qdb files written with set can be read by kfromfile or written by ktofile:

>>> from aiokdb.files import kfromfile, ktofile
>>> k = kfromfile('test_qdb0/test.qdb')
>>> k
<aiokdb.KObjArray object at 0x7559136d8230>
>>> from aiokdb.format import AsciiFormatter
>>> fmt = AsciiFormatter()
>>> print(fmt.format(k))
[5, hello]

Ordinarily k is dictionary representing a KDB namespace containing other objects.

Tests

The library has extensive test coverage, however de-serialisation of certain (obscure) KObj may not be fully supported yet. PR's welcome. All tests are pure python except for those in test/test_rpc.py, which will use a real KDB server to test against if you set the KDB_PYTEST_SERVICE environment variable (to a URL of the form kdb://user:password@hostname:port), otherwise that test is skipped.

  • Formatting with ruff check .
  • Formatting with ruff format .
  • Check type annotations with mypy --strict .
  • Run pytest . in the root directory

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

aiokdb-0.1.8.tar.gz (31.2 kB view details)

Uploaded Source

Built Distribution

aiokdb-0.1.8-py3-none-any.whl (22.0 kB view details)

Uploaded Python 3

File details

Details for the file aiokdb-0.1.8.tar.gz.

File metadata

  • Download URL: aiokdb-0.1.8.tar.gz
  • Upload date:
  • Size: 31.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.0 CPython/3.12.4

File hashes

Hashes for aiokdb-0.1.8.tar.gz
Algorithm Hash digest
SHA256 4105c6184038c7e6222cd880d6e221e34b5800598f82607eeaf3f511753fb7bc
MD5 afe8f6fb09be02c4b60023b84c1a76ae
BLAKE2b-256 b6b4d1de03e1a999f938b7ad0578138424a6dcb0a18ebe2e1dc34d8f756a3ea4

See more details on using hashes here.

File details

Details for the file aiokdb-0.1.8-py3-none-any.whl.

File metadata

  • Download URL: aiokdb-0.1.8-py3-none-any.whl
  • Upload date:
  • Size: 22.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.0 CPython/3.12.4

File hashes

Hashes for aiokdb-0.1.8-py3-none-any.whl
Algorithm Hash digest
SHA256 2cf1afd7108e9cd53d4eb70c267ad4be7e48b216e3cbf55fb250d0599b2f84f6
MD5 14a906ad8726a2c338043e042b9aaab8
BLAKE2b-256 dd611fe733a1f115fcf54537092762579351c3692a309dcdbfdc2c98244d683b

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page