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

Uploaded Source

Built Distributions

lsm-0.3.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (873.3 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.12+ x86-64 manylinux: glibc 2.5+ x86-64

lsm-0.3.11-cp310-cp310-macosx_10_14_x86_64.whl (951.5 kB view details)

Uploaded CPython 3.10 macOS 10.14+ x86-64

lsm-0.3.11-cp39-cp39-win_amd64.whl (726.3 kB view details)

Uploaded CPython 3.9 Windows x86-64

lsm-0.3.11-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (873.5 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.12+ x86-64 manylinux: glibc 2.5+ x86-64

lsm-0.3.11-cp39-cp39-macosx_10_14_x86_64.whl (951.7 kB view details)

Uploaded CPython 3.9 macOS 10.14+ x86-64

lsm-0.3.11-cp38-cp38-win_amd64.whl (726.5 kB view details)

Uploaded CPython 3.8 Windows x86-64

lsm-0.3.11-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (873.6 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.12+ x86-64 manylinux: glibc 2.5+ x86-64

lsm-0.3.11-cp38-cp38-macosx_10_14_x86_64.whl (951.0 kB view details)

Uploaded CPython 3.8 macOS 10.14+ x86-64

lsm-0.3.11-cp37-cp37m-win_amd64.whl (722.4 kB view details)

Uploaded CPython 3.7m Windows x86-64

lsm-0.3.11-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (873.6 kB view details)

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

lsm-0.3.11-cp37-cp37m-macosx_10_14_x86_64.whl (947.4 kB view details)

Uploaded CPython 3.7m macOS 10.14+ x86-64

lsm-0.3.11-cp36-cp36m-win_amd64.whl (722.4 kB view details)

Uploaded CPython 3.6m Windows x86-64

lsm-0.3.11-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (873.5 kB view details)

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

lsm-0.3.11-cp36-cp36m-macosx_10_14_x86_64.whl (947.4 kB view details)

Uploaded CPython 3.6m macOS 10.14+ x86-64

File details

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

File metadata

  • Download URL: lsm-0.3.11.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.11.tar.gz
Algorithm Hash digest
SHA256 beaea4212a17cbc10ad44a5f58264e4c831e251dba0877a9eceb4e4fe4442f46
MD5 7e935fbea9fe7b1acaa79202f981184e
BLAKE2b-256 e055be3b1455e62b3461412a9661ee4cbbd4ff50eb4a58b1a1015cd3ce6a89d0

See more details on using hashes here.

File details

Details for the file lsm-0.3.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for lsm-0.3.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 27218d85421cd19978c33abfc6a071d5cf31fa26a96d240dcf86f773525769e0
MD5 21275610b1802f85f895760339c303eb
BLAKE2b-256 67968dee691ad557dcb6a1321bcb7b0a7fe76bb7d3f12f3f1958f258676b46d4

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.11-cp310-cp310-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 951.5 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.11-cp310-cp310-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 ddc634fe18cb6daa146615cf0b181e0f223754f79350cf0389a4e0bafb0165c7
MD5 6ab4ff6288e296e76daf84786e060551
BLAKE2b-256 8104ac6a3d6c56e0c8d25d7c0d8db206d4020057e25cab08f68a1d1875738a29

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.11-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 726.3 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.11-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 033cb1b69f9dbe74ad7870d37c28c9e82c8b9bbdab9c3d8f1c2b01759346ab14
MD5 0de13b69e46392733d5334804ffe9c9b
BLAKE2b-256 786c7f785b83a005bd7e124de37c0259fdf1fa94ad2166019579f9c315ccea07

See more details on using hashes here.

File details

Details for the file lsm-0.3.11-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for lsm-0.3.11-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 e6528c857b8ac05f1c24a569703cf15327e1a71a8305db88fae54c0b3efa941c
MD5 5a52d9e140cd26a9b2529682c4f2aa82
BLAKE2b-256 2765981a52f3bfb4ae7ab2dae77469984117de6182ef4b1021d68799311ffc90

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.11-cp39-cp39-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 951.7 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.11-cp39-cp39-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 e352cc6d061d2dbd1cc14088dddc13f0bdee2e027df8904cfef8ef29cc883858
MD5 7fced021c926489d58951af49ff8f06c
BLAKE2b-256 4a8c1796c8330f7b4017d6e6ee85abaa8c1e966979eb35fb036161e82fd394cb

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.11-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 726.5 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.11-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 c8a71b5dec2615975371354cddb7945e046f0ef2839faf577b867cf5ca61fb96
MD5 0ced2ba567c2f6704e65636e2f3ae542
BLAKE2b-256 61ed9469951bb23156d93d24f4aa7624c9f662ca68dca900b7984cd0d9992eb2

See more details on using hashes here.

File details

Details for the file lsm-0.3.11-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for lsm-0.3.11-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 422169d5cbc94dcc2458811709c4489a80302afb6e01dbe95312f678313383d8
MD5 6c1765949fe9b7e449a53b07ec2024b7
BLAKE2b-256 6aae61ebb55a725615ce4266b990e70c59d0bb7e065f5c548d0bc7969df19488

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.11-cp38-cp38-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 951.0 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.11-cp38-cp38-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 e1fc26bbf66d6a34a51f96b118cff9cea11d935655e1d5312c9c59b03948f169
MD5 a9d8a8ea680201c05cf7e4af9fcd7b94
BLAKE2b-256 8661c8b8dfdd82addf36d3e82efb1890fa9ee82585d875b2b2bc98e7589df7c5

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.11-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 722.4 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.11-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 6fc88c993b92c35aa35d580ee64102cba7ec7b69211c2e70bc4a4a604f443ede
MD5 2177d8c1b5e9ac9c7659956b6324b829
BLAKE2b-256 8a7d0e67d38e882ef3de51ee69c531a5493ceb639d4c789fc78dff698c4a9899

See more details on using hashes here.

File details

Details for the file lsm-0.3.11-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for lsm-0.3.11-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 16f2fe58b1636ae6c743b2d3c843c1c59464243776af2524d58d5eb80f245166
MD5 b9909fcffc9336aa6edc5559d1ecf5c1
BLAKE2b-256 a7883b5633bcbd9215c35866455499a7fceb9a0c411a7ec94ed81ee7a2f0293d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.11-cp37-cp37m-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 947.4 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.11-cp37-cp37m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 45bf1a8e64241712fb4484b04b55d65ec1a31a3b961188dc67dffb68d31fddb8
MD5 77e8bc2a95da52ec8349f41c63c9ae9a
BLAKE2b-256 b7012a12a27d47eb61bb07f4c5d161c7575c8ff6aa1f2b632829eb1736724140

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.11-cp36-cp36m-win_amd64.whl
  • Upload date:
  • Size: 722.4 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.11-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 71ffb83c57e8fdb51c0ece876dc20201e0568f6e4761bb58d7dc93b7862bfd3c
MD5 2a8f663609b4b4ff917dfe9995cd6db7
BLAKE2b-256 99e60cb7f1c559b96125c7a973fb1e302de41cd911ce33ddb5391981ab4f705f

See more details on using hashes here.

File details

Details for the file lsm-0.3.11-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for lsm-0.3.11-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 af095c4cf0b275ad5274608ad0635815a50e20d7f149d98b5b582c7ca3da69c8
MD5 1eaa5ce79b6db09c5b20408c572a71ab
BLAKE2b-256 93b64f0afb631d63ce14f9cf43f78f805609a7642f3c90eade5045937a339f8f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.11-cp36-cp36m-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 947.4 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.11-cp36-cp36m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 c0900b33b7d81b1218a56ee868cf3443bcc8dd166f813a60df53f77e3935ebaf
MD5 819749289887574baade54342a3175b4
BLAKE2b-256 f5598b30cdfb51196b8c8d92adaa5e45034d62489cd4dff83a08710382494914

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