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

Uploaded Source

Built Distributions

lsm-0.4.5-cp310-cp310-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.10 Windows x86-64

lsm-0.4.5-cp310-cp310-macosx_11_0_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.10 macOS 11.0+ x86-64

lsm-0.4.5-cp39-cp39-win_amd64.whl (1.2 MB view details)

Uploaded CPython 3.9 Windows x86-64

lsm-0.4.5-cp39-cp39-macosx_11_0_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.9 macOS 11.0+ x86-64

lsm-0.4.5-cp38-cp38-win_amd64.whl (1.2 MB view details)

Uploaded CPython 3.8 Windows x86-64

lsm-0.4.5-cp38-cp38-macosx_10_15_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.8 macOS 10.15+ x86-64

lsm-0.4.5-cp37-cp37m-win_amd64.whl (1.2 MB view details)

Uploaded CPython 3.7m Windows x86-64

lsm-0.4.5-cp37-cp37m-macosx_10_15_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.7m macOS 10.15+ x86-64

lsm-0.4.5-cp36-cp36m-win_amd64.whl (1.2 MB view details)

Uploaded CPython 3.6m Windows x86-64

lsm-0.4.5-cp36-cp36m-macosx_10_14_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.6m macOS 10.14+ x86-64

File details

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

File metadata

  • Download URL: lsm-0.4.5.tar.gz
  • Upload date:
  • Size: 800.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.16

File hashes

Hashes for lsm-0.4.5.tar.gz
Algorithm Hash digest
SHA256 fde06093413c5749ddc5c239f5b180643abfd9836903848c3349a95fd6cafbe0
MD5 5481f5ad8aadc5e56da2cbcaee4a90f3
BLAKE2b-256 25213988b93c9e76cca83da41c149236dcd2af13e413807ca8770466ab4f39e2

See more details on using hashes here.

File details

Details for the file lsm-0.4.5-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: lsm-0.4.5-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.9

File hashes

Hashes for lsm-0.4.5-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 29978bd0ce1126cf1fed2ca51ae40b1625541657c13cff490bc2dee0a19f8ce3
MD5 48591140a9c258e849649c7a1cdd40ce
BLAKE2b-256 caf0bc5457edd6e344dcda704ef4bd84c5b174a2461d459c6562eee67ec16258

See more details on using hashes here.

File details

Details for the file lsm-0.4.5-cp310-cp310-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for lsm-0.4.5-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 0ee186d2c7ed5ba483829eb34316d50db47f2563d47d961143ef6f336bba1a6b
MD5 0b0a422834962d53ceb202c566061bea
BLAKE2b-256 465bb1e18d871271c9dc658033b2b6a905b51d910d1789586a9da73657d6acce

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.4.5-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 1.2 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.13

File hashes

Hashes for lsm-0.4.5-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 e1aea4c75413b933b26381b80d033e6a167e5f20937477655fc83739c9e1d1fc
MD5 9cbdfe86db80766d383be9bd53656c78
BLAKE2b-256 f2bc798a8ffa598ad2f0045d21185c914ad5e2ade3ccd4e487d01599c16b23b4

See more details on using hashes here.

File details

Details for the file lsm-0.4.5-cp39-cp39-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for lsm-0.4.5-cp39-cp39-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 1e02de9499898034711adaf810b8588b6c76f2631810bad17d9fa9eb05318684
MD5 37b23c4a1a901f4e4bd6a24e932ec725
BLAKE2b-256 994d34feeb5b9a81b3cf432899be54fa46e76c908436b9466be01b93adfd2aff

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.4.5-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 1.2 MB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.8.10

File hashes

Hashes for lsm-0.4.5-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 b9f91102ac68e0fd214a89562606899e15115f53f63b446ad7cdf5a2a5ef2834
MD5 f938e2a9b689ac544dd9ca6e9ee40dd5
BLAKE2b-256 2ccb2218af82e98a4e2de8b97565613f8ed876aa87bba149e4815e6d30cb7206

See more details on using hashes here.

File details

Details for the file lsm-0.4.5-cp38-cp38-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for lsm-0.4.5-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 9ab5d574cb1b80886e236cd626f7aab2f72d533ed1299d8a4a00f00277362f4c
MD5 f6053dd2250ab00dee7ca9dd406aa9f1
BLAKE2b-256 c23f27f6e45781235801ca67e4f83a9f69f3b8a07ed28bc3ac6072f2420072b5

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.4.5-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 1.2 MB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.7.9

File hashes

Hashes for lsm-0.4.5-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 411c26511efa8c7e5d716d790e634d1032c721596b1aa0433cd25bf14df3a561
MD5 c596d195703c8bf6f555199a2547db7c
BLAKE2b-256 bcd0bbde5d82b49c4b7d21bf8351f035b7e3fe4861637cab1fafd651588dbc2a

See more details on using hashes here.

File details

Details for the file lsm-0.4.5-cp37-cp37m-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for lsm-0.4.5-cp37-cp37m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 7c9a5cd10dfe79d7ea64d66a31742de06d8e2094fa0941c7843c913ef3c951c3
MD5 0ae1e45060d3d6a0c47326a4559b7244
BLAKE2b-256 0ed98878fff6190fd7e4cc5e23ae9f752512e2cce35352cc6345ce3b7c2d5779

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.4.5-cp36-cp36m-win_amd64.whl
  • Upload date:
  • Size: 1.2 MB
  • Tags: CPython 3.6m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.9.2 readme-renderer/34.0 requests/2.27.1 requests-toolbelt/0.10.1 urllib3/1.26.13 tqdm/4.64.1 importlib-metadata/4.8.3 keyring/23.4.1 rfc3986/1.5.0 colorama/0.4.5 CPython/3.6.8

File hashes

Hashes for lsm-0.4.5-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 eda2d04b372f601e627ac22cf6bb2663cfac3b3f755ac15d122a0781471eaf2a
MD5 3d52517672acd2ffb639826d7b6eac59
BLAKE2b-256 6ee98680d89555aceccb5ed00d14c4dcc5b169729be007e27c27c122d68d4144

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.4.5-cp36-cp36m-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 1.5 MB
  • Tags: CPython 3.6m, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.9.2 readme-renderer/34.0 requests/2.27.1 requests-toolbelt/0.10.1 urllib3/1.26.13 tqdm/4.64.1 importlib-metadata/4.8.3 keyring/23.4.1 rfc3986/1.5.0 colorama/0.4.5 CPython/3.6.15

File hashes

Hashes for lsm-0.4.5-cp36-cp36m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 e762c10cd01ef472c1b706cf3e002f4a3fab2a9c3cbe8a59f73b745985e1ad7d
MD5 bd564e2436dc60ab647c173c62383838
BLAKE2b-256 4a08f69ce84c01524c2e0d4d6472fab7d793ba8982090b7df446126cdf4d2ea8

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