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

Uploaded Source

Built Distributions

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

Uploaded CPython 3.9 Windows x86-64

lsm-0.3.5-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.5-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.5-cp38-cp38-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.8 Windows x86-64

lsm-0.3.5-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.5-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.5-cp37-cp37m-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.7m Windows x86-64

lsm-0.3.5-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.5-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.5-cp36-cp36m-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.6m Windows x86-64

lsm-0.3.5-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.5-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.5.tar.gz.

File metadata

  • Download URL: lsm-0.3.5.tar.gz
  • Upload date:
  • Size: 871.3 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.1 CPython/3.9.5

File hashes

Hashes for lsm-0.3.5.tar.gz
Algorithm Hash digest
SHA256 db3dcee2f4b4f9c5d4dbd1f818f7812e5790996dfc0460e59af9cda136c3dddd
MD5 afd44ef5a252eacb11530af3e68c584e
BLAKE2b-256 cc13008f1b8d131353b03820e799ee77389917407ac13af5b74e8613c820759e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.5-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.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.9.5

File hashes

Hashes for lsm-0.3.5-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 51be8aedf6617312c1777f955f7ccacbfe19af7145a2f93b45993c8d9583e822
MD5 556258af8e0dcff707cfb40f76a1ee55
BLAKE2b-256 360c43be6e4b2e716a5ea359dc02626d98636fa7e718c940920244a2b52485a0

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.5-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.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.9.5

File hashes

Hashes for lsm-0.3.5-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 9b63446b4f975455417c2cfd7a7fa70f41610dbbf06fb42645f85f4dc6a34d05
MD5 a0632de6ff37c3cfd299888b18ae15bd
BLAKE2b-256 cf58ea6ee3020c05eb6cf1e48d49869f103eeb343b9f98e18d4026dd1b27cca8

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.5-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.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.9.5

File hashes

Hashes for lsm-0.3.5-cp39-cp39-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 c41e090bef16915bb550e4f20a49fa92f68a7cf8739c925ead30bdb84db6145c
MD5 7942b7be04a387cd5730e7ddacb184d6
BLAKE2b-256 db82abc5ffba3a9971a819ad510819825805431b41de476aef6eb00d757c23bc

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.5-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.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.8.10

File hashes

Hashes for lsm-0.3.5-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 038b6b16772d86a5267ff3279909c2c68a89e520fb03c04fd613d9e7707a5157
MD5 d8a05f6814e03dc6a8309a3e86a9fea7
BLAKE2b-256 bc150f7d43abf3f039b7f4868b7b215b991df92b1713e51009b5623853c66acc

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.5-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.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.9.5

File hashes

Hashes for lsm-0.3.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 12271c671cdccd495ffd15e25587f61a818bbe67f44cff59bea11b985bfcc73a
MD5 b7f6b3b5839e067a541817b781d54f56
BLAKE2b-256 5c2858450369567dc0aff5cfe33455c88d0b0dfe9cd322b841d0e90ea9948161

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.5-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.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.8.10

File hashes

Hashes for lsm-0.3.5-cp38-cp38-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 2080366f4937e3d361a837565212c1c1edf29480cbac573cd8de14bb60315be8
MD5 3a0bd541371221497d4b67f0de3d7d05
BLAKE2b-256 074cb9e4b8f2e29868cd66f346449bb69a3f0e549731d7c82eae04220128f110

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.5-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.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.7.9

File hashes

Hashes for lsm-0.3.5-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 16b58fd5b9b58b53f4c45a51507b97d30c4c5c50d141e0aef225c77bfd81b650
MD5 fdd534ef582f565126ae567802d0b80f
BLAKE2b-256 34482710a3ca3625d89e18b62908131da3811e0896b3b260d2bfc857135c5bfa

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.5-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.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.9.5

File hashes

Hashes for lsm-0.3.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 02004b119e7da7cb6e5981657f1a8d5420bcd2aa32a9e914e2c2bc4b2d821072
MD5 3ac3f5a0b1d8290193ee5638bc155dec
BLAKE2b-256 9d3cd252291e026a7f0e8478b58b5dfeb4cb96a890d28098673d1d04b6231d10

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.5-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.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.7.10

File hashes

Hashes for lsm-0.3.5-cp37-cp37m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 56c6db6b1f3188065142de0e8f1ad1016d9886f645d7e9dd8832d95435c3f69d
MD5 c74b2335030857d86930b3e4d793c08c
BLAKE2b-256 9d651b5a883453ca70940da68131673c1140876cc12130b075bf208cf232764a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.5-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.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.6.8

File hashes

Hashes for lsm-0.3.5-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 5c778e2783af3920d3a89e57a80156c2d8ed21d2b53c5944b73393f7fc2397d4
MD5 f7c5e53c0aabef6393abac1afd7bbb79
BLAKE2b-256 30ddd620977441b9bbe32e541439640fd5703cb30f387e713d0ff275a65274e5

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.5-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.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.9.5

File hashes

Hashes for lsm-0.3.5-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 707f269741696b86ba28382a9cb9b87ff5facefffd36934734d1f9429fb006ca
MD5 4d5c9dabcc64b23a962f420d28646dad
BLAKE2b-256 ed3de742994fca121df927cfbc18806035d247abe8877c7ad52002c346a94f08

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.5-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.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.6.13

File hashes

Hashes for lsm-0.3.5-cp36-cp36m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 5b5a26dc22838ac6433c37da2890e81854ba88b71d8cd9e830d219f44d074368
MD5 1a348769aa4e3d9dbadea59bc3717999
BLAKE2b-256 9f678b6062be5a73bd7bd415168bef65aeb06873c8995c20797a9f09f723b0c4

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