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

Uploaded Source

Built Distributions

lsm-0.3.10-cp310-cp310-macosx_10_14_x86_64.whl (951.7 kB view details)

Uploaded CPython 3.10 macOS 10.14+ x86-64

lsm-0.3.10-cp39-cp39-win_amd64.whl (726.4 kB view details)

Uploaded CPython 3.9 Windows x86-64

lsm-0.3.10-cp39-cp39-macosx_10_14_x86_64.whl (951.8 kB view details)

Uploaded CPython 3.9 macOS 10.14+ x86-64

lsm-0.3.10-cp38-cp38-win_amd64.whl (726.7 kB view details)

Uploaded CPython 3.8 Windows x86-64

lsm-0.3.10-cp38-cp38-macosx_10_14_x86_64.whl (951.1 kB view details)

Uploaded CPython 3.8 macOS 10.14+ x86-64

lsm-0.3.10-cp37-cp37m-win_amd64.whl (722.5 kB view details)

Uploaded CPython 3.7m Windows x86-64

lsm-0.3.10-cp37-cp37m-macosx_10_14_x86_64.whl (947.6 kB view details)

Uploaded CPython 3.7m macOS 10.14+ x86-64

lsm-0.3.10-cp36-cp36m-win_amd64.whl (722.5 kB view details)

Uploaded CPython 3.6m Windows x86-64

lsm-0.3.10-cp36-cp36m-macosx_10_14_x86_64.whl (947.5 kB view details)

Uploaded CPython 3.6m macOS 10.14+ x86-64

File details

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

File metadata

  • Download URL: lsm-0.3.10.tar.gz
  • Upload date:
  • Size: 369.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.8

File hashes

Hashes for lsm-0.3.10.tar.gz
Algorithm Hash digest
SHA256 8f4a94c733990301d796a2c0a337db8653154e34582e1b74868722f6d2c7e43e
MD5 925baa7324d115f40d14dc93257cbde3
BLAKE2b-256 74b0290ef023b71f6a22b8d0094d6e979d4badd0e6c0682c3681d55967673ca9

See more details on using hashes here.

File details

Details for the file lsm-0.3.10-cp310-cp310-macosx_10_14_x86_64.whl.

File metadata

  • Download URL: lsm-0.3.10-cp310-cp310-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 951.7 kB
  • Tags: CPython 3.10, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.10.0

File hashes

Hashes for lsm-0.3.10-cp310-cp310-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 faa1cee63492efaac33804fd88fc34eac868d35dac5e2d6946aaa6489e340133
MD5 67a0531c5dba7b67e82c274fe0a40b6e
BLAKE2b-256 29e1145a13e3a1e480fb3385fcb03aa11ea6637ffec756f9c9950a12d255f4c3

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.10-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 726.4 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.8

File hashes

Hashes for lsm-0.3.10-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 048ccb46214a3624d4d416689120ff7eee7cf209cc492147075c4bc67a8e775c
MD5 0264befca889a6dbadd95ad055cb3bbb
BLAKE2b-256 ce12dcd672bc5c82ac773a66274a01ab6a664c95db1b6ccfd43156d49e1e2869

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.10-cp39-cp39-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 951.8 kB
  • Tags: CPython 3.9, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.8

File hashes

Hashes for lsm-0.3.10-cp39-cp39-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 7baf103be2bca028d3ced501a7ebbfba675431a5b931495610e1bac2045a33de
MD5 fb70d7259b3ac86f4fadb963b1423b5b
BLAKE2b-256 c8920e6eb67fb351e32ee0f068ceb120bcbdbe275101256b22e408ac511dae35

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.10-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 726.7 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10

File hashes

Hashes for lsm-0.3.10-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 4abaf0a679e569f4076a6bc2c828d44152896a49eed3b30490ada7c6c25b626f
MD5 e19ec87dbfef3b4f07938b72a70283d6
BLAKE2b-256 a2ab417d334434b1de199010c7e5d66a43ceee65331ced8b3573c812426417ec

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.10-cp38-cp38-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 951.1 kB
  • Tags: CPython 3.8, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.12

File hashes

Hashes for lsm-0.3.10-cp38-cp38-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 91e679cbde899c60583cd9438fecfa804e822c0736a7af81b4f2b3d38ee483ec
MD5 854a79fd5dc9442b02248c971c56fafd
BLAKE2b-256 10f15d8a166162edf45611dd18d46b569accabbade458bed8dab894b11d71d22

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for lsm-0.3.10-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 f0290985593f82cffb8936b9eb1a11615f869e4b21d30cd1bcc8aadcbc910826
MD5 72c14b82a8235df78c51cb8413b49242
BLAKE2b-256 3c01ebfe3bef2e31653a8c0e3498c5d846a3ede4f0e2db7cb8b0ce17bce42b84

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.10-cp37-cp37m-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 947.6 kB
  • Tags: CPython 3.7m, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.7.12

File hashes

Hashes for lsm-0.3.10-cp37-cp37m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 38fdaae9a75ee55bc1923406fda53e5066857b23178987f2f6f9a7a7b9358829
MD5 6a009130936646b80609c5fa0daf2c1a
BLAKE2b-256 799a31cc09801f9cf9c8d73cc80ce7fc9a63c24ca207498ec639f3754fb57b5f

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for lsm-0.3.10-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 b3fd6d06d619131bd35c0038f12cfc38893de5c5fe33dd9c84a82d16c0cbe4f3
MD5 9c6c25caf86a6dcd740e8e793feb127b
BLAKE2b-256 ad1064daea80964cfce2efbf3b60030364f31754b2bcf23f1ba60ad6d2efbe5a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.10-cp36-cp36m-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 947.5 kB
  • Tags: CPython 3.6m, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.6.15

File hashes

Hashes for lsm-0.3.10-cp36-cp36m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 3d11372961c7ee9e773fdc819f320d3cc81c5d98d0be16662c5f4448850d533c
MD5 76317916f5d51453641be5d97ffa6a04
BLAKE2b-256 23b96a27a9aac6c5489ca327fa444c4026dc3d795ed968bacc53c6fc7e0bf5c6

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