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

Uploaded Source

Built Distributions

lsm-0.3.0-cp39-cp39-win_amd64.whl (723.2 kB view details)

Uploaded CPython 3.9 Windows x86-64

lsm-0.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.5+ x86-64

lsm-0.3.0-cp39-cp39-macosx_10_14_x86_64.whl (815.0 kB view details)

Uploaded CPython 3.9 macOS 10.14+ x86-64

lsm-0.3.0-cp38-cp38-win_amd64.whl (723.2 kB view details)

Uploaded CPython 3.8 Windows x86-64

lsm-0.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.5+ x86-64

lsm-0.3.0-cp38-cp38-macosx_10_14_x86_64.whl (814.9 kB view details)

Uploaded CPython 3.8 macOS 10.14+ x86-64

lsm-0.3.0-cp37-cp37m-win_amd64.whl (719.0 kB view details)

Uploaded CPython 3.7m Windows x86-64

lsm-0.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl (1.5 MB view details)

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

lsm-0.3.0-cp37-cp37m-macosx_10_14_x86_64.whl (810.8 kB view details)

Uploaded CPython 3.7m macOS 10.14+ x86-64

lsm-0.3.0-cp36-cp36m-win_amd64.whl (719.0 kB view details)

Uploaded CPython 3.6m Windows x86-64

lsm-0.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl (1.5 MB view details)

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

lsm-0.3.0-cp36-cp36m-macosx_10_14_x86_64.whl (810.8 kB view details)

Uploaded CPython 3.6m macOS 10.14+ x86-64

File details

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

File metadata

  • Download URL: lsm-0.3.0.tar.gz
  • Upload date:
  • Size: 368.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.0 CPython/3.9.5

File hashes

Hashes for lsm-0.3.0.tar.gz
Algorithm Hash digest
SHA256 e2f96086409732ddee888ff2ff6a962424a22a6e4efb1f48136a6e912748bc93
MD5 3aa3e1bb7889e18cda0364d5380f9c48
BLAKE2b-256 bd61b5aa82050327f3dbfca8bd1dc23d58c2296592a9a9c410a38d9f517b2754

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 723.2 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.0 CPython/3.9.5

File hashes

Hashes for lsm-0.3.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 15f80bc5239866332f888df3d33c50992732705626de0118ea2ff43282710358
MD5 8a3df2601337ad2e1932581fe74cc42a
BLAKE2b-256 2c4d58392196aa274e6769bb91fc44c1a5c4d482686514c98f545f0ac4877039

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl
  • Upload date:
  • Size: 1.5 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.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.0 CPython/3.9.5

File hashes

Hashes for lsm-0.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 7c4985f7b0639c40144672392355f2dd83d074e62f72e8d7c427ccfe553da26d
MD5 942455c3ec3afd90b8f3ce6fe3d2023e
BLAKE2b-256 de53deee6844e7e701248ba6573214bc9baee34459f181a961b78739536d5732

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.0-cp39-cp39-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 815.0 kB
  • Tags: CPython 3.9, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.0 CPython/3.9.5

File hashes

Hashes for lsm-0.3.0-cp39-cp39-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 e35b767f255e4758f46367356833ef0bd3b76246e5110bf8732a9d9fc370f34f
MD5 3f2451fee778cd903de47dd393513a49
BLAKE2b-256 3775a714e65335acf6d465aad80eafb8da41c4b9a5adb6b5643990c0df00501d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.0-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 723.2 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.0 CPython/3.8.10

File hashes

Hashes for lsm-0.3.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 22a7732ce087dd8934af8c647ad1292a50a20de15201691a501117f265d368d9
MD5 a39ea7e098ed9d38ce2a8a8e9ae03d45
BLAKE2b-256 8f7a0fd0c84856bbf5cd9d8ea4a0c37e7db89ea6c163c6be1ff5ebf10934fc28

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl
  • Upload date:
  • Size: 1.5 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.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.0 CPython/3.9.5

File hashes

Hashes for lsm-0.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 ff8fe6dfd6e7ac87d8d5400cbcf0082bb04c388dac34d352b97b5dcdc1808c71
MD5 7ec5921e391a81665b6e46f91ba20ed6
BLAKE2b-256 9e01120dc914859a5bf4201d4de75466123c4ccaf18c387e1d3a3d27a16f50bd

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.0-cp38-cp38-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 814.9 kB
  • Tags: CPython 3.8, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.0 CPython/3.8.10

File hashes

Hashes for lsm-0.3.0-cp38-cp38-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 0d9c484f8b0c7e748bec6e785293f8cf40e00d62c9ea530c5613b5a6ff762bbf
MD5 2cc88eff20033683c6999c633feb05e3
BLAKE2b-256 5588a13f6d0169c5ae813f62c4668366086abf79e782ad71846e632a3f08a494

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.0-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 719.0 kB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.3.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.0 CPython/3.7.9

File hashes

Hashes for lsm-0.3.0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 92777108cd1ae8d011cd262334dffe39f73e5027b25dadd484235f138c85595c
MD5 855ca856e3827b041ab6922c6e0132b9
BLAKE2b-256 bd7f04d4330e06871bfa159fc3f30ddf1bf23f1d4985f8b7bee582985c6e2b9e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl
  • Upload date:
  • Size: 1.5 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.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.0 CPython/3.9.5

File hashes

Hashes for lsm-0.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 cca6dd5e8e2977c3dde5b97f9e2f761353c0b6db2d95fe225d645ec3f678f189
MD5 8d529c860fc57bff6d096abffb9bb1f7
BLAKE2b-256 c02ffb4fd7ac9b26d03f057f024e84f60fdb8d1c1edbe47245d24d5b6a1f2064

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.0-cp37-cp37m-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 810.8 kB
  • Tags: CPython 3.7m, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.0 CPython/3.7.10

File hashes

Hashes for lsm-0.3.0-cp37-cp37m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 ea1a402e23f4bfdbcf9d943de3495d5e51766a8a40c6148fd8a663f8177962fc
MD5 7fc0265aabd23ead4c7b3dd588fa15ad
BLAKE2b-256 a0d74f5358e8b76a23fa13ca9fe9edff74ed510b7391362138bee848ef1eb86b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.0-cp36-cp36m-win_amd64.whl
  • Upload date:
  • Size: 719.0 kB
  • Tags: CPython 3.6m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.0 CPython/3.6.8

File hashes

Hashes for lsm-0.3.0-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 bb8670b0cc2b1a621c00cbe6512b69c74c492b00bc18d8db276c2c3b53f8bf0e
MD5 f7cefa6205271ef69f82985873dfb8a8
BLAKE2b-256 540bbf21fc8c8b2ce7cd90bdac85288ffc5c2ef11dfa1376f621a51ada7ab738

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl
  • Upload date:
  • Size: 1.5 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.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.0 CPython/3.9.5

File hashes

Hashes for lsm-0.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 5c4117cb58afaedf657e1084fbdf8e8b59efdee1d9a5cda8cb4f6c703cfbd208
MD5 5ccff8320047a46d9a26f320e635d1bb
BLAKE2b-256 a8bd8868b57180f085bd670d44c35c24e645950632aefa4eb124c9d25d3138c1

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.0-cp36-cp36m-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 810.8 kB
  • Tags: CPython 3.6m, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.0 CPython/3.6.13

File hashes

Hashes for lsm-0.3.0-cp36-cp36m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 6a5f40610cf200830880c6ab2335fd33a1a5306b613c221a9acdaf562728531e
MD5 4151eeee54e5a50cd84c7f02ec83e930
BLAKE2b-256 a0031d71a944597eca854593055df2439019f9c77d85a5d3984b0ceef2fb7e83

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