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

Uploaded Source

Built Distributions

lsm-0.3.8-cp39-cp39-win_amd64.whl (726.8 kB view details)

Uploaded CPython 3.9 Windows x86-64

lsm-0.3.8-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.8-cp39-cp39-macosx_10_14_x86_64.whl (817.8 kB view details)

Uploaded CPython 3.9 macOS 10.14+ x86-64

lsm-0.3.8-cp38-cp38-win_amd64.whl (726.9 kB view details)

Uploaded CPython 3.8 Windows x86-64

lsm-0.3.8-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.8-cp38-cp38-macosx_10_14_x86_64.whl (817.5 kB view details)

Uploaded CPython 3.8 macOS 10.14+ x86-64

lsm-0.3.8-cp37-cp37m-win_amd64.whl (722.7 kB view details)

Uploaded CPython 3.7m Windows x86-64

lsm-0.3.8-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.8-cp37-cp37m-macosx_10_14_x86_64.whl (813.3 kB view details)

Uploaded CPython 3.7m macOS 10.14+ x86-64

lsm-0.3.8-cp36-cp36m-win_amd64.whl (722.7 kB view details)

Uploaded CPython 3.6m Windows x86-64

lsm-0.3.8-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.8-cp36-cp36m-macosx_10_14_x86_64.whl (813.3 kB view details)

Uploaded CPython 3.6m macOS 10.14+ x86-64

File details

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

File metadata

  • Download URL: lsm-0.3.8.tar.gz
  • Upload date:
  • Size: 369.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.6

File hashes

Hashes for lsm-0.3.8.tar.gz
Algorithm Hash digest
SHA256 a7ad851984497b905bc8e9b3ac3da372b1114daff700f4a8a4df595760ca3ebb
MD5 d90eb589d18c852717dc37b73254f15c
BLAKE2b-256 2916601b9fb8ac1015d75933cd825c8ab501141ce48ed448633f700a0418c9c6

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.8-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 726.8 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.6

File hashes

Hashes for lsm-0.3.8-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 0bbb005c21dbff2bf32a8fc269d4248ddbc53147346dbbe21e701c83e4079ddf
MD5 c56bf6cc2d21e8b3dcecd25d82ac37d4
BLAKE2b-256 14c043552e4f3c8a9258e090c1159d1a3b260cd85e9acc2b76e01866cdf9857e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.8-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.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.6

File hashes

Hashes for lsm-0.3.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 176e7f34e725905ec66253eea213c0af541d7fd33136b9396889076b56e58f4e
MD5 59e375320cdb539992c63c7a232a0485
BLAKE2b-256 877a41c3ae310a9a383a554273768e8a7bb275f7cc791be2364561c0614d1851

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.8-cp39-cp39-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 817.8 kB
  • Tags: CPython 3.9, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.6

File hashes

Hashes for lsm-0.3.8-cp39-cp39-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 339094b6d753bd54050b9620774133d2951d50155a0a3003be77310fb6e7e7bf
MD5 ef0cadd3da758bd97020213de2402b8d
BLAKE2b-256 8d8e10524d82e53f49a83926ba990e5e4f0bec5132248af19aec3f1cd218427a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.8-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 726.9 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.8.10

File hashes

Hashes for lsm-0.3.8-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 df06ad615014da3a8a2d3bf5a8c9689395ec68620648eda8c139a3c2cc5bd37e
MD5 47809f5b2493a65bef5d0a0b7de62201
BLAKE2b-256 5b0d82c4d7a2d0c22411fe3b9d7181f932618a0ff89186bf2b7cb3318cc6eb60

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.8-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.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.6

File hashes

Hashes for lsm-0.3.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 7509f0968b322d7b66fc849e4dbb1eab4a6045c84c32bf6bc66726d0bc28039d
MD5 12f28d1dbe480f2375e251d02dde7ead
BLAKE2b-256 20aedda4ee090a71a4f5308ab8fb323720ae60410a934133cc3e2ace201c96d3

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.8-cp38-cp38-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 817.5 kB
  • Tags: CPython 3.8, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.8.11

File hashes

Hashes for lsm-0.3.8-cp38-cp38-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 b701bf3114d012aa2244ce1b007e81c87f5366a96704a80792d7127ab66a6509
MD5 cea75786b9cff15bec6faf715fdf4c02
BLAKE2b-256 55e22841b1ae0e2d6104c42c458c23a3b784c10c75153f9f627a55d3255d2c98

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for lsm-0.3.8-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 315d2457f84a317971c61e0a12325bf1af6b40fcffc0ac860e13d8d360210554
MD5 afa9ed2aad54cc830a7d2d5b68b64dcb
BLAKE2b-256 03d5d3b568e1be3b66d82adfc5ae2a0af64bd6e3c1b23067b8ef15e4a36ca7ea

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.8-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.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.6

File hashes

Hashes for lsm-0.3.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 616e4debabb9d0e5adc57d082c7883f5f503bd412eddb811cbc3f1681fe243e4
MD5 880ddbff9ddb064ec258f839465c399a
BLAKE2b-256 c40868ae02e88a10df24644a5b01f00cb6215f737916e931f430db13ad3753be

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.8-cp37-cp37m-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 813.3 kB
  • Tags: CPython 3.7m, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.7.11

File hashes

Hashes for lsm-0.3.8-cp37-cp37m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 7a271d1c882a5c427802323019ca5e4a9a5ba84c40cfd40ec802a6553ddf01eb
MD5 4e1c0b6021dc53f351816c6d4e643a8a
BLAKE2b-256 b4164f3d0ed652625a70338a689984decca0b5283b8f42c5e58caa64300cc295

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for lsm-0.3.8-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 38b283fa65d56af82412c84830ec9304133591d6c232aec34a9390863aa56243
MD5 7a8e5dc98666f3f225ee1479ff868189
BLAKE2b-256 b57da43288073d92617222bcd2f3e4de4b2a7c662ba935bdd49a81bd38c10be6

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.8-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.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.6

File hashes

Hashes for lsm-0.3.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 0c3823da0fc52bf7e3382d71c84e45aac40b2c5bccb91ed74b7a46abb8df9d78
MD5 556d2d0a344c3a50106640f5ad0f50d5
BLAKE2b-256 bfe2f2ab353212bfec06df2b32f235eb1855053f9b28fa311651808161dccae3

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.8-cp36-cp36m-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 813.3 kB
  • Tags: CPython 3.6m, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.6.14

File hashes

Hashes for lsm-0.3.8-cp36-cp36m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 705becb57b53e6d3f54eebfe79e585072c14b390e90af0b65456769f89a17651
MD5 422336dac53bd8ed9c1572ad05d03879
BLAKE2b-256 d3a9a985b20844c31f69939cab5d012c0adcec5aeba85625943c8cb4b3c1e6e7

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