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.7.tar.gz (871.3 kB view details)

Uploaded Source

Built Distributions

lsm-0.3.7-cp39-cp39-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.9 Windows x86-64

lsm-0.3.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.5+ x86-64

lsm-0.3.7-cp39-cp39-macosx_10_14_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.9 macOS 10.14+ x86-64

lsm-0.3.7-cp38-cp38-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.8 Windows x86-64

lsm-0.3.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.5+ x86-64

lsm-0.3.7-cp38-cp38-macosx_10_14_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.8 macOS 10.14+ x86-64

lsm-0.3.7-cp37-cp37m-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.7m Windows x86-64

lsm-0.3.7-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl (2.1 MB view details)

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

lsm-0.3.7-cp37-cp37m-macosx_10_14_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.7m macOS 10.14+ x86-64

lsm-0.3.7-cp36-cp36m-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.6m Windows x86-64

lsm-0.3.7-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl (2.1 MB view details)

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

lsm-0.3.7-cp36-cp36m-macosx_10_14_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.6m macOS 10.14+ x86-64

File details

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

File metadata

  • Download URL: lsm-0.3.7.tar.gz
  • Upload date:
  • Size: 871.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.6.1 pkginfo/1.7.1 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.9.5

File hashes

Hashes for lsm-0.3.7.tar.gz
Algorithm Hash digest
SHA256 08b35e170d301303e1c0e325d994b8cdc1084738cd3944c487b371fc319cf37d
MD5 62273d29125128cc08af1623c224643b
BLAKE2b-256 a481d2beebe8061795aaf8de3c69456c56f5bdf432c5031bd913411b90fc767b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.7-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 1.3 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.6.1 pkginfo/1.7.1 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.9.5

File hashes

Hashes for lsm-0.3.7-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 4f7f7857464284f64bf6d623a58645a6cc2f69072ee228f08c83732d45b6411b
MD5 96a4e761f39368638ad42178b0fcce92
BLAKE2b-256 ab4c86c982fb730a7ae35d90d635ea6bdd3459496d54613205bb5b95159166ab

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl
  • Upload date:
  • Size: 2.1 MB
  • Tags: CPython 3.9, manylinux: glibc 2.5+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.6.1 pkginfo/1.7.1 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.9.5

File hashes

Hashes for lsm-0.3.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 470660bf188ce2e679f388b7a58fbbcd419aebcdae4a9178a8060ad1f6a6736f
MD5 d80aabeedfca269d500ff3b199f4abe9
BLAKE2b-256 4f82d2c5a4998ff1c328ed240737048e703684f5311a4df54908bafe1cc2b1d2

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.7-cp39-cp39-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.9, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.6.1 pkginfo/1.7.1 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.9.5

File hashes

Hashes for lsm-0.3.7-cp39-cp39-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 e2b3dcff2a26402d205362b0208c5411182f159b18406883fd482c8136fca0bf
MD5 896e687a28976a5308818c86f7c56166
BLAKE2b-256 55fc4f66651f5d4b67b50b5fe39f61c2e7e3493798afcaac9ad108ded58065ab

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.7-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 1.3 MB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.6.1 pkginfo/1.7.1 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.8.10

File hashes

Hashes for lsm-0.3.7-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 e68a0ef9a70db7e45ecdb694e6472ef86b9b6b95ec0b66f9382373b3b798f4fc
MD5 cf0a4817a16b8dde83add4d028b39da5
BLAKE2b-256 84e9b1a15b974d2cffaa973d5b437343765cc90a18b9562cc3149691bcedb6f4

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl
  • Upload date:
  • Size: 2.1 MB
  • Tags: CPython 3.8, manylinux: glibc 2.5+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.6.1 pkginfo/1.7.1 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.9.5

File hashes

Hashes for lsm-0.3.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 96147cd387fa353d3dc267cb48e8bd83e6e1a4fe5c70866f4e8c9b9f6c762ecb
MD5 662c843baa8877b80fc4e01935ec5d4e
BLAKE2b-256 b3c1c0205512e4cc627800e2997ac1e6ce1323bf259e14b0e08ca8c22eb7ef60

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.7-cp38-cp38-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.8, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.6.1 pkginfo/1.7.1 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.8.10

File hashes

Hashes for lsm-0.3.7-cp38-cp38-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 8465d9b1d31894181754d0fee0792beb7b8c8f30a7720904910d78eeba549aba
MD5 393256d065cbac1d950ccbdb6ed8adfe
BLAKE2b-256 cbd46c358d833f68d767d4264b5b0a0246c5b3e6149fb652868c9cbc402a8334

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.7-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 1.3 MB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.6.0 pkginfo/1.7.1 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.7.9

File hashes

Hashes for lsm-0.3.7-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 8a2d370e9a3c7554f63727325e35ae1b62ed5d954b435d9a75311a7def937187
MD5 f89b9e07c38b2d58058e9b08040e3e58
BLAKE2b-256 de6def7b0534b1d7bae708d1d173dd0d08fcb64faa907dfc6adcf4d49e91f73c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.7-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl
  • Upload date:
  • Size: 2.1 MB
  • Tags: CPython 3.7m, manylinux: glibc 2.5+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.6.1 pkginfo/1.7.1 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.9.5

File hashes

Hashes for lsm-0.3.7-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 a85c1e0edf7ae06283fc223bd02a98bac01d630767e7611b6c6a5eb6d909d0e6
MD5 d49afb53a2dc7a0a560dea4e1c40ddae
BLAKE2b-256 055c5e6d8c154f263cf41b7dd8b42ae44d6ca0221651dd1ea5011ccf86d4b9b1

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.7-cp37-cp37m-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.7m, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.6.1 pkginfo/1.7.1 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.7.10

File hashes

Hashes for lsm-0.3.7-cp37-cp37m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 46d0c41e9999849ede438eeb566cb2ac7997d8172f13ecee1447fbeb677fdac1
MD5 06ca85d96d17baed963c4709e6a8cdb9
BLAKE2b-256 f5ed75ec3e1bc9f08a5031ba1f167f0b2ea3307118aa257bd1fd29341fa1db08

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.7-cp36-cp36m-win_amd64.whl
  • Upload date:
  • Size: 1.3 MB
  • Tags: CPython 3.6m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.6.1 pkginfo/1.7.1 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.6.8

File hashes

Hashes for lsm-0.3.7-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 2375979bac862ff27196c6ae366d4bea9a47e978ee2aeaac4bb21525a38766b9
MD5 d4a165ea2793b1b7ae75d978b46ae74e
BLAKE2b-256 1dc0c111d7af23e9644f5c4261954d60435a3b100352840a4a2c6fdbb7aeff4e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.7-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl
  • Upload date:
  • Size: 2.1 MB
  • Tags: CPython 3.6m, manylinux: glibc 2.5+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.6.1 pkginfo/1.7.1 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.9.5

File hashes

Hashes for lsm-0.3.7-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 ee5c62496c6817692c12e7da0586b2638b82ca0f4b1fc23fd32c3bad98eb854f
MD5 f2ba301455b6e67288a2d0c9d01957b0
BLAKE2b-256 61e4d5c0e67a324b6be80890dc1b826711a0c9edd68be8edfad1292f6f574812

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.7-cp36-cp36m-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.6m, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.6.1 pkginfo/1.7.1 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.6.13

File hashes

Hashes for lsm-0.3.7-cp36-cp36m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 2def7ca558d4a18dde3b68ab4df644c36f544fffc4809da550e1e2ea8e8fb7a8
MD5 ab1e451d99dafbeb97416a176871818b
BLAKE2b-256 81fa01ea09e45dd713b20cb9e804a61e7dd48be52a495cbc745d5b1f5ad7f930

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