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

Uploaded Source

Built Distributions

lsm-0.2.1-cp39-cp39-win_amd64.whl (722.7 kB view details)

Uploaded CPython 3.9 Windows x86-64

lsm-0.2.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.5+ x86-64

lsm-0.2.1-cp39-cp39-macosx_10_14_x86_64.whl (968.4 kB view details)

Uploaded CPython 3.9 macOS 10.14+ x86-64

lsm-0.2.1-cp38-cp38-win_amd64.whl (722.9 kB view details)

Uploaded CPython 3.8 Windows x86-64

lsm-0.2.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.5+ x86-64

lsm-0.2.1-cp38-cp38-macosx_10_14_x86_64.whl (967.7 kB view details)

Uploaded CPython 3.8 macOS 10.14+ x86-64

lsm-0.2.1-cp37-cp37m-win_amd64.whl (718.7 kB view details)

Uploaded CPython 3.7m Windows x86-64

lsm-0.2.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl (1.3 MB view details)

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

lsm-0.2.1-cp37-cp37m-macosx_10_14_x86_64.whl (963.4 kB view details)

Uploaded CPython 3.7m macOS 10.14+ x86-64

lsm-0.2.1-cp36-cp36m-win_amd64.whl (718.7 kB view details)

Uploaded CPython 3.6m Windows x86-64

lsm-0.2.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl (1.3 MB view details)

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

lsm-0.2.1-cp36-cp36m-macosx_10_14_x86_64.whl (963.4 kB view details)

Uploaded CPython 3.6m macOS 10.14+ x86-64

File details

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

File metadata

  • Download URL: lsm-0.2.1.tar.gz
  • Upload date:
  • Size: 367.9 kB
  • Tags: Source
  • 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.9.5

File hashes

Hashes for lsm-0.2.1.tar.gz
Algorithm Hash digest
SHA256 47f6c5498d090931979f9d4500146fdff8c05e45a8b1b0c3e5ff9e7b24004ed4
MD5 8bf24539d166589d04ed0af7bd03ef7e
BLAKE2b-256 637eade686bb637b5b564e7de1f02a9a715b9e09ac1face20731826921c095fa

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.2.1-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 722.7 kB
  • Tags: CPython 3.9, 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.9.5

File hashes

Hashes for lsm-0.2.1-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 c02cfb82e9668c11981bcdb306958854e7f56fbd1c0fdeabc98c6f258db505d8
MD5 39e773475a157bcfcf67d256a278826c
BLAKE2b-256 b8a8aa140a59a21fa378e1200b886b2501a2f4f5d9fa4daee841ac92828ffcab

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.2.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl
  • Upload date:
  • Size: 1.3 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.3.1 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.2.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 daa0d626de250b658235a4e3123279ebcc8b662441f3666d6ed9493021d2c747
MD5 89c3fc21ef790ebd1a12f5ce09876b0d
BLAKE2b-256 6d44fcb8baedce2ea1a500a2a71cb08839d856141561bd9cae8a333d405b8497

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.2.1-cp39-cp39-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 968.4 kB
  • Tags: CPython 3.9, macOS 10.14+ 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.9.5

File hashes

Hashes for lsm-0.2.1-cp39-cp39-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 0a81cae3f4de363c4e43ae73160a700ee77e47b599b8d30440802541216c3044
MD5 b8a61ba38233d25cdc4b4278952e1cf6
BLAKE2b-256 fdbf8d7fefa7e373bf9a22b866cc9bbdff064d152af1db07b8b3c7a136e35b0a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.2.1-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 722.9 kB
  • Tags: CPython 3.8, 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.8.10

File hashes

Hashes for lsm-0.2.1-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 b0ce6c9057e7012b1783cafc75e942feefa6fb8aa4e72b76f9c565b9f57e4d4a
MD5 e9377895028eba6b55e2d60587d11a02
BLAKE2b-256 a65930dd95ddd35266435cc82ef99f1f55ba974da1d6abaf61b8431cf5384118

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.2.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl
  • Upload date:
  • Size: 1.3 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.3.1 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.2.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 735368bf36dd9b9e0554898ed20ecded9fd4953e561d1bfe23935866404d6d77
MD5 29846293ec02da88692605754799f59e
BLAKE2b-256 77cc1f669db0c50fee1002e6c966ce08941d471845a0c5f997f075dcd31a1d6f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.2.1-cp38-cp38-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 967.7 kB
  • Tags: CPython 3.8, macOS 10.14+ 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.8.10

File hashes

Hashes for lsm-0.2.1-cp38-cp38-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 47a23f855937128c66c6f40c141bb8c2d9ea7528fe6a7828a310f4b589b814bb
MD5 2a94fb8cab594e9d6fefb896ecc03310
BLAKE2b-256 0fd6d432b05c2e6084eb89ccbf2265aef31bcbef28407dae34b05515c9fa4f78

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.2.1-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 718.7 kB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.0.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.2.1-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 b83a245f23daee9c72f071a24431a70d38d599b6ed1f01a1383a955c5a48eb0e
MD5 ca2af61169902845ac224cdeb7228df1
BLAKE2b-256 39478496558165a3c750b80bca3dbc72fe6b4c7c6592b8b579286a6290fc16c6

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.2.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl
  • Upload date:
  • Size: 1.3 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.3.1 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.2.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 a56f952907de49e9295439f82dc97edf24741d92400e6556dafb902dea6cd49f
MD5 44cc229a5621c313637440197ae27dab
BLAKE2b-256 4be56965d07546aa43f19c84460a595c2db5bf207b1f6468082a17337923b6a2

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.2.1-cp37-cp37m-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 963.4 kB
  • Tags: CPython 3.7m, macOS 10.14+ 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.10

File hashes

Hashes for lsm-0.2.1-cp37-cp37m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 160babca17e1de38a0bf7e92693047f03b2cf72b5cdb92cbe6b11ed3f7759cdd
MD5 9c0d88cff7d6394b5792284304b9d79b
BLAKE2b-256 02b10794aef4bfabd834834cd1fd2d13f4cda5a66921dc3ff1fa9288d0866c7c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.2.1-cp36-cp36m-win_amd64.whl
  • Upload date:
  • Size: 718.7 kB
  • Tags: CPython 3.6m, 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.6.8

File hashes

Hashes for lsm-0.2.1-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 0810e1b832a36c2faa20b6564de71a6f1a9f32e0884d489b7a9f176b9a03f85a
MD5 83402140261afeb1174628401cc5d9a4
BLAKE2b-256 124c5238f620bfd18abf8edfc3e7909b06a06aedad72d59d5c2fc9732e239c4f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.2.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl
  • Upload date:
  • Size: 1.3 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.3.1 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.2.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 59721200aef4130f1b9bad6ac6bd827ec9520c207935cf2a351988fab233c19a
MD5 a0a1cf0f713feadcf4217d26fee31e56
BLAKE2b-256 9eef6422e4047c5f017559ecbd429eb68e8874f7b913639fa5c53621cde47680

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.2.1-cp36-cp36m-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 963.4 kB
  • Tags: CPython 3.6m, macOS 10.14+ 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.6.13

File hashes

Hashes for lsm-0.2.1-cp36-cp36m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 a3d6d23dea089004b6e25cee10d41f2ab45adf7e171af4a3b9b081683493866b
MD5 28e256f9e7e84b1d715c41202e347704
BLAKE2b-256 0f93e1572515b46800f8a82776d4e66e46bd77b85ffd258a995d5e27adacfdb3

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