Skip to main content

Python bindings for SQLite's LSM key/value engine

Project description

lsm

Fast Python bindings for SQLite's LSM key/value store. The LSM storage engine was initially written as part of the experimental SQLite4 rewrite (now abandoned). More recently, the LSM source code was moved into the SQLite3 source tree and has seen some improvements and fixes. This project uses the LSM code from the SQLite3 source tree.

Features:

  • Embedded zero-conf database.
  • Keys support in-order traversal using cursors.
  • Transactional (including nested transactions).
  • Single writer/multiple reader MVCC based transactional concurrency model.
  • On-disk database stored in a single file.
  • Data is durable in the face of application or power failure.
  • Thread-safe.
  • Releases GIL for read and write operations (each connection has own mutex)
  • Page compression (lz4 or zstd)
  • Zero dependency static library
  • Python 3.x.

Limitations:

The source for Python lsm is hosted on GitHub.

If you encounter any bugs in the library, please open an issue, including a description of the bug and any related traceback.

Quick-start

Below is a sample interactive console session designed to show some of the basic features and functionality of the lsm Python library.

To begin, instantiate a LSM object, specifying a path to a database file.

>>> from lsm import LSM
>>> db = LSM('test.ldb')
>>> db.open()
>>> print(db)
<LSM at "/tmp/test.ldb" as 0x10951e450>

More pythonic variant is using context manager:

>>> from lsm import LSM
>>> with LSM("/tmp/test.ldb") as db:
...     print(db)
<LSM at "/tmp/test.ldb" as 0x10951e450>

Binary/string mode

You should select mode for opening the database with binary: bool = True argument.

For example when you want to store strings just pass binary=False:

>>> from lsm import LSM
>>> with LSM("/tmp/test.ldb", binary=False) as db:
...    db['foo'] = 'bar'   # must be str for keys and values
...    print(db['foo'])
bar

Otherwise, you must pass keys and values ad bytes (default behaviour):

>>> from lsm import LSM
>>> with LSM("/tmp/test.ldb") as db:
...    db[b'foo'] = b'bar'   # must be bytes for keys and values
...    print(db[b'foo'])
b'bar'

Key/Value Features

lsm is a key/value store, and has a dictionary-like API:

>>> from lsm import LSM
>>> with LSM("/tmp/test.ldb", binary=False) as db:
...    db['foo'] = 'bar'
...    print(db['foo'])
bar

Database apply changes as soon as possible:

>>> from lsm import LSM
>>> db = LSM("/tmp/test.ldb", binary=False)
>>> db.open()
True
>>> for i in range(4):
...     db[f'k{i}'] = str(i)
...
>>> 'k3' in db
True
>>> 'k4' in db
False
>>> del db['k3']
>>> db['k3']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: "Key 'k3' was not found"

By default when you attempt to look up a key, lsm will search for an exact match. You can also search for the closest key, if the specific key you are searching for does not exist:

>>> from lsm import, LSM, SEEK_LE, SEEK_GE
>>> db = LSM("/tmp/test.ldb", binary=False)
>>> db.open()
True
>>> db['k1xx', SEEK_LE]  # Here we will match "k1".
'1'
>>> db['k1xx', SEEK_GE]  # Here we will match "k2".
'2'

LSM supports other common dictionary methods such as:

  • keys()
  • values()
  • items()
  • update()

Slices and Iteration

The database can be iterated through directly, or sliced. When you are slicing the database the start and end keys need not exist -- lsm will find the closest key (details can be found in the LSM.fetch_range() documentation).

>>> [item for item in db.items()]
[('foo', 'bar'), ('k0', '0'), ('k1', '1'), ('k2', '2')]

>>> db['k0':'k99']
<lsm_slice object at 0x10d4f3500>

>>> list(db['k0':'k99'])
[('k0', '0'), ('k1', '1'), ('k2', '2')]

You can use open-ended slices. If the lower- or upper-bound is outside the range of keys an empty list is returned.

>>> list(db['k0':])
[('k0', '0'), ('k1', '1'), ('k2', '2')]

>>> list(db[:'k1'])
[('foo', 'bar'), ('k0', '0'), ('k1', '1')]

>>> list(db[:'aaa'])
[]

To retrieve keys in reverse order or stepping over more then one item, simply use a third slice argument as usual. Negative step value means reverse order, but first and second arguments must be ordinary ordered.

>>> list(db['k0':'k99':2])
[('k0', '0'), ('k2', '2')]

>>> list(db['k0'::-1])
[('k2', '2'), ('k1', '1'), ('k0', '0')]

>>> list(db['k0'::-2])
[('k2', '2'), ('k0', '0')]


>>> list(db['k0'::3])
[('k0', '0')]

You can also delete slices of keys, but note that the delete will not include the keys themselves:

>>> del db['k0':'k99']

>>> list(db)  # Note that 'k0' still exists.
[('foo', 'bar'), ('k0', '0')]

Cursors

While slicing may cover most use-cases, for finer-grained control you can use cursors for traversing records.

>>> with db.cursor() as cursor:
...     for key, value in cursor:
...         print(key, '=>', value)
...
foo => bar
k0 => 0

>>> db.update({'k1': '1', 'k2': '2', 'k3': '3', 'foo': 'bar'})

>>> with db.cursor() as cursor:
...     cursor.first()
...     print(cursor.key())
...     cursor.last()
...     print(cursor.key())
...     cursor.previous()
...     print(cursor.key())
...
foo
k3
k2

>>> with db.cursor() as cursor:
...     cursor.seek('k0', SEEK_GE)
...     print(list(cursor.fetch_until('k99')))
...
[('k0', '0'), ('k1', '1'), ('k2', '2'), ('k3', '3')]

It is very important to close a cursor when you are through using it. For this reason, it is recommended you use the LSM.cursor() context-manager, which ensures the cursor is closed properly.

Transactions

lsm supports nested transactions. The simplest way to use transactions is with the LSM.transaction() method, which doubles as a context-manager or decorator.

>>> with db.transaction() as txn:
...     db['k1'] = '1-mod'
...     with db.transaction() as txn2:
...         db['k2'] = '2-mod'
...         txn2.rollback()
...
True
>>> print(db['k1'], db['k2'])
1-mod 2

You can commit or roll-back transactions part-way through a wrapped block:

>>> with db.transaction() as txn:
...    db['k1'] = 'outer txn'
...    txn.commit()  # The write is preserved.
...
...    db['k1'] = 'outer txn-2'
...    with db.transaction() as txn2:
...        db['k1'] = 'inner-txn'  # This is commited after the block ends.
...    print(db['k1']  # Prints "inner-txn".)
...    txn.rollback()  # Rolls back both the changes from txn2 and the preceding write.
...    print(db['k1'])
...
1              <- Return value from call to commit().
inner-txn      <- Printed after end of txn2.
True           <- Return value of call to rollback().
outer txn      <- Printed after rollback.

If you like, you can also explicitly call LSM.begin(), LSM.commit(), and LSM.rollback().

>>> db.begin()
>>> db['foo'] = 'baze'
>>> print(db['foo'])
baze
>>> db.rollback()
True
>>> print(db['foo'])
bar

Thanks to

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

lsm-0.3.9.tar.gz (369.2 kB view details)

Uploaded Source

Built Distributions

lsm-0.3.9-cp39-cp39-win_amd64.whl (726.4 kB view details)

Uploaded CPython 3.9 Windows x86-64

lsm-0.3.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl (845.3 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.5+ x86-64

lsm-0.3.9-cp39-cp39-macosx_10_14_x86_64.whl (951.8 kB view details)

Uploaded CPython 3.9 macOS 10.14+ x86-64

lsm-0.3.9-cp38-cp38-win_amd64.whl (726.7 kB view details)

Uploaded CPython 3.8 Windows x86-64

lsm-0.3.9-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl (845.4 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.5+ x86-64

lsm-0.3.9-cp38-cp38-macosx_10_14_x86_64.whl (951.1 kB view details)

Uploaded CPython 3.8 macOS 10.14+ x86-64

lsm-0.3.9-cp37-cp37m-win_amd64.whl (722.5 kB view details)

Uploaded CPython 3.7m Windows x86-64

lsm-0.3.9-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl (845.4 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.5+ x86-64

lsm-0.3.9-cp37-cp37m-macosx_10_14_x86_64.whl (947.5 kB view details)

Uploaded CPython 3.7m macOS 10.14+ x86-64

lsm-0.3.9-cp36-cp36m-win_amd64.whl (722.5 kB view details)

Uploaded CPython 3.6m Windows x86-64

lsm-0.3.9-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl (845.3 kB view details)

Uploaded CPython 3.6m manylinux: glibc 2.5+ x86-64

lsm-0.3.9-cp36-cp36m-macosx_10_14_x86_64.whl (947.5 kB view details)

Uploaded CPython 3.6m macOS 10.14+ x86-64

File details

Details for the file lsm-0.3.9.tar.gz.

File metadata

  • Download URL: lsm-0.3.9.tar.gz
  • Upload date:
  • Size: 369.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.8

File hashes

Hashes for lsm-0.3.9.tar.gz
Algorithm Hash digest
SHA256 0c5d4ef15dfaf90770f2392a54629a7f12f7988c09673840e38c781c3d8a1a71
MD5 175ea3b110ab25f5b7a612009773ff9a
BLAKE2b-256 411bf9e3c60fc9337059d39b16b14c03f97140915cece03f78c5f261501685f9

See more details on using hashes here.

File details

Details for the file lsm-0.3.9-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: lsm-0.3.9-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 726.4 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.8

File hashes

Hashes for lsm-0.3.9-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 65153a9a5db1554afbd0ea7a15e4c916c30f234ddb9b46a623f147662107d9b2
MD5 0071b1fcf6b4dc7677ac769f11d50e66
BLAKE2b-256 10be3603ad1a1c7adcd5296a4351ed71eea18b8947c281b3192b0220af0badb6

See more details on using hashes here.

File details

Details for the file lsm-0.3.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl.

File metadata

  • Download URL: lsm-0.3.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl
  • Upload date:
  • Size: 845.3 kB
  • Tags: CPython 3.9, manylinux: glibc 2.5+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.8

File hashes

Hashes for lsm-0.3.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 4ffff241ddfb0ad992ba55f958be091793d3a2f739486cbc70ca6071e71b412d
MD5 05018476f08c20f229b5d4af5e089010
BLAKE2b-256 c1e8ae1c1a1d5c844ffc524d7ec4e0f35287f5f701d09b5e33b48396e00e1fea

See more details on using hashes here.

File details

Details for the file lsm-0.3.9-cp39-cp39-macosx_10_14_x86_64.whl.

File metadata

  • Download URL: lsm-0.3.9-cp39-cp39-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 951.8 kB
  • Tags: CPython 3.9, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.8

File hashes

Hashes for lsm-0.3.9-cp39-cp39-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 305a06151c4f82c5591be463435dc0274cb318f001f83f4181ec380604c4aa3b
MD5 4712646bb32c72c83cea265a6d1fec7d
BLAKE2b-256 dae9664df98397934253c8abe6c38d95bdd092e266264815581b3479288a3898

See more details on using hashes here.

File details

Details for the file lsm-0.3.9-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: lsm-0.3.9-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 726.7 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10

File hashes

Hashes for lsm-0.3.9-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 a2e0f430ceffcacad82734172ecd27d55f9f7214b44876e6e6790a767d974a82
MD5 dae4a7d6331671bbdadaacb1f828a2bd
BLAKE2b-256 13f2bb462acb4fbdd9da8721ada9dc4877ee6e39a8bbbe717ba1d1e6d86759f3

See more details on using hashes here.

File details

Details for the file lsm-0.3.9-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl.

File metadata

  • Download URL: lsm-0.3.9-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl
  • Upload date:
  • Size: 845.4 kB
  • Tags: CPython 3.8, manylinux: glibc 2.5+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.8

File hashes

Hashes for lsm-0.3.9-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 ca26dad645281577a8fd0b07d955cee0d3a6e8d725790818c0809d96f3918c3c
MD5 ad714f0bb73fafdcc1c609977a020d9a
BLAKE2b-256 a521bc72a58fad790586207e896072408ea6086a3e85edbcbb8981f647b238c4

See more details on using hashes here.

File details

Details for the file lsm-0.3.9-cp38-cp38-macosx_10_14_x86_64.whl.

File metadata

  • Download URL: lsm-0.3.9-cp38-cp38-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 951.1 kB
  • Tags: CPython 3.8, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.12

File hashes

Hashes for lsm-0.3.9-cp38-cp38-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 1eac8efc5da5404c852934dddbb76deb8f6e6ab55efd1bcab4c93e444ad5df11
MD5 3e7bb95f0f0b37f57f458ad5cbed5ff1
BLAKE2b-256 c74e9e857ef6014594efddfc50ebd073ad5d259fb3e970a344c79895e0ee1659

See more details on using hashes here.

File details

Details for the file lsm-0.3.9-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: lsm-0.3.9-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 722.5 kB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.7.9

File hashes

Hashes for lsm-0.3.9-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 bf6ecbcccfcb30427a7a33fb5215bf6de4e5406050992187f317c9e3aed3f8d9
MD5 963fda649cec84bc82ad4d67ac701dd4
BLAKE2b-256 958127d60e0f371dc66fec918b36cfaf932d2541f7249eec99d462dbf11d6778

See more details on using hashes here.

File details

Details for the file lsm-0.3.9-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl.

File metadata

  • Download URL: lsm-0.3.9-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl
  • Upload date:
  • Size: 845.4 kB
  • Tags: CPython 3.7m, manylinux: glibc 2.5+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.8

File hashes

Hashes for lsm-0.3.9-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 f1068c8e09d85063bdff961904f10f00c505acbc0e1d5b57ea0e725333ff6a52
MD5 f8eb8de7a11617ef7267b255f5c2de5a
BLAKE2b-256 d7ebf8b6fe1e8d6ab5311bf6f11bff9f50bc2b3f5aad33893bfae24b37b977bf

See more details on using hashes here.

File details

Details for the file lsm-0.3.9-cp37-cp37m-macosx_10_14_x86_64.whl.

File metadata

  • Download URL: lsm-0.3.9-cp37-cp37m-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 947.5 kB
  • Tags: CPython 3.7m, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.7.12

File hashes

Hashes for lsm-0.3.9-cp37-cp37m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 774822f711714a10ae50b33a7a2733308acd58e14f365d8de738f49bd7a05474
MD5 ac3c415136be1683292574de37fa4b1e
BLAKE2b-256 5bc9256a79a5c886434de17f11a55ff3f53e92c05ab168344eaed7aec087c5ce

See more details on using hashes here.

File details

Details for the file lsm-0.3.9-cp36-cp36m-win_amd64.whl.

File metadata

  • Download URL: lsm-0.3.9-cp36-cp36m-win_amd64.whl
  • Upload date:
  • Size: 722.5 kB
  • Tags: CPython 3.6m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.6.8

File hashes

Hashes for lsm-0.3.9-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 1761373d6a62c61b8e38b87b050aca485c26ebb75e72049becdced03c072334d
MD5 56c605a9858d91313e913b7c04fb1506
BLAKE2b-256 264126fb916e50e51236d32691304291b1597bf0e7b21a7ed5150ff57f59ca97

See more details on using hashes here.

File details

Details for the file lsm-0.3.9-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl.

File metadata

  • Download URL: lsm-0.3.9-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl
  • Upload date:
  • Size: 845.3 kB
  • Tags: CPython 3.6m, manylinux: glibc 2.5+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.8

File hashes

Hashes for lsm-0.3.9-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 fe4f0708352414c3cd8cc7b851895486059111464cbdf71030a71ce1fc436f40
MD5 b92481fa9dd21cb56ae49275f879bdd3
BLAKE2b-256 deab55d3bae5b5bfe8d5518372d1ca5d55d196e4553dc6ab7cb8d73cb6869f71

See more details on using hashes here.

File details

Details for the file lsm-0.3.9-cp36-cp36m-macosx_10_14_x86_64.whl.

File metadata

  • Download URL: lsm-0.3.9-cp36-cp36m-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 947.5 kB
  • Tags: CPython 3.6m, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.6.15

File hashes

Hashes for lsm-0.3.9-cp36-cp36m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 33a960c9d4b36834d6e2cd8a9760e67f33b3ad2dec628280a5e61a1df50a2326
MD5 04d54e5b789899325e1e83be1c9fe80d
BLAKE2b-256 e87af5aeb27515ca32e28ffadf14cae071d394a82fa59777169eb4c66895aa64

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