sekejap for Python
An embedded, disk-first, multi-model database: documents addressed by
collection and key, SQL with $n parameters over the same rows, typed edges
between them, and vector and spatial fields in the one store.
This package is pure Python. It compiles nothing and it contains no Rust:
it loads libsekejap — the shared library built from
dist/ffi, whose contract is
docs/dist/C_ABI.md — and calls its 59
entry points through ctypes. A platform wheel ships that library inside the
package; an install from the source distribution finds one on the machine.
from sekejap import Db
with Db("./data") as db:
db.create_collection("venues", [
{"name": "name", "kind": "text"},
{"name": "suburb", "kind": "text"},
{"name": "capacity", "kind": "int"},
])
db.put("venues", "the_tote", {"name": "The Tote", "suburb": "Collingwood"})
for row in db.query("SELECT _key, name FROM venues WHERE suburb = $1",
["Collingwood"]):
print(row["_key"], row["name"])
Install
pip install sekejap
A wheel for your platform carries the library and needs nothing else. If you installed from the source distribution, or you want to run against a library you built yourself:
cargo build --release -p sekejap-capi # in the sekejap repository
export SEKEJAP_LIBRARY=/path/to/libsekejap.dylib
SEKEJAP_LIBRARY is looked at first, then sekejap/_lib/ inside the package,
then the platform loader path (DYLD_LIBRARY_PATH, LD_LIBRARY_PATH, PATH,
and wherever make install in dist/ffi put it). sekejap.library_path()
says which one this process loaded.
The handles
One class per opaque pointer in the C ABI. Each is a context manager, and
closing a Db closes every handle taken from it first, because each of them
borrows it.
| class | from | what it is |
|---|---|---|
Db |
Db(path), Db.open_service(path) |
the database. May be shared across threads |
Statement |
db.prepare(sql) |
one statement, parsed once, compiled at its first bind |
Scan |
db.scan(collection), db.stream(sql) |
a paged walk. Iterating yields documents; .pages() yields pages |
Tx |
db.transaction() |
the writer, held across many writes under one barrier |
Errors
A failure raises. The exception carries code, a Status enumeration member,
so you branch on the code and never on the text of message.
from sekejap import Db, Refused, Status
try:
db.compact()
except Refused as refusal:
print(refusal.code is Status.REFUSED, refusal.message)
SekejapError is the base; Refused, Corrupt, Unsupported, IoFailure,
Invalid, Busy and UnknownRow are the named ones. A miss is not a
failure and does not raise: db.get and db.describe answer None, a walk
answers None at its end, and db.next_change answers None when nothing
arrived.
Every C function, and the call that reaches it
| C function | Python |
|---|---|
sekejap_open |
Db(path) / Db.open(path) |
sekejap_open_with_config |
Db(path, config={"budget_bytes": ..., "io": ..., "sync": ...}) |
sekejap_open_service |
Db.open_service(path) / Db(path, service=True) |
sekejap_close |
db.close(), or leaving a with block |
sekejap_version |
sekejap.version() |
sekejap_format_version |
sekejap.format_version() |
sekejap_last_error |
sekejap.last_error(), and error.message on every exception |
sekejap_last_error_code |
sekejap.last_error_code(), and error.code |
sekejap_string_free |
inside the wrapper: every returned string is copied and freed once |
sekejap_put |
db.put(collection, key, document) |
sekejap_put_many |
db.put_many(collection, rows) — a dict, pairs, or {"key", "doc"} objects |
sekejap_get |
db.get(collection, key) → dict or None |
sekejap_exists |
db.exists(collection, key) |
sekejap_delete |
db.delete(collection, key) |
sekejap_scan_open |
db.scan(collection, page_rows=0) |
sekejap_scan_next |
scan.next_page(), scan.pages(), iter(scan) |
sekejap_scan_close |
scan.close() |
sekejap_execute |
db.execute(sql, params) → rows moved |
sekejap_query |
db.query(sql, params) → list[dict] |
sekejap_explain |
db.explain(sql, params) |
sekejap_prepare |
db.prepare(sql) |
sekejap_stmt_query |
statement.query(params) |
sekejap_stmt_execute |
statement.execute(params) |
sekejap_stmt_rebindable |
statement.rebindable → True / False / None (not bound yet) |
sekejap_stmt_free |
statement.close() |
sekejap_query_open |
db.stream(sql, params, page_rows=0) |
sekejap_query_next |
scan.next_page() |
sekejap_query_close |
scan.close() |
sekejap_link |
db.link(from_collection, from_key, edge_type, to_collection, to_key) |
sekejap_link_with |
the same call with properties={...} |
sekejap_unlink |
db.unlink(...) |
sekejap_neighbours |
db.neighbours(collection, key, edge_type, direction, limit) |
sekejap_create_collection |
db.create_collection(name, fields) |
sekejap_drop_collection |
db.drop_collection(name) |
sekejap_collections |
db.collections() |
sekejap_describe |
db.describe(collection) → dict or None |
sekejap_count_rows |
db.count_rows(collection) |
sekejap_scan_count_rows |
db.scan_count_rows(collection) |
sekejap_scan_count_edges |
db.scan_count_edges() |
sekejap_tx_begin |
db.transaction() |
sekejap_tx_put |
tx.put(collection, key, document) |
sekejap_tx_delete |
tx.delete(collection, key) |
sekejap_tx_link |
tx.link(...) |
sekejap_tx_execute |
tx.execute(sql, params) |
sekejap_tx_commit |
tx.commit(), or a clean exit from with db.transaction() |
sekejap_tx_rollback |
tx.rollback(), or an exception inside that block |
sekejap_checkpoint |
db.checkpoint() → True folded, False deferred |
sekejap_publish |
db.publish() |
sekejap_storage |
db.storage() |
sekejap_statement_timeout_ms |
db.statement_timeout_ms(ms) |
sekejap_cancel |
db.cancel() |
sekejap_clear_interrupt |
db.clear_interrupt() |
sekejap_subscribe |
db.subscribe() |
sekejap_next_change |
db.next_change(subscription, timeout_ms=0) |
sekejap_unsubscribe |
db.unsubscribe(subscription) |
sekejap_open_memory |
sekejap.open_memory() — refused: sekejap is disk-first |
sekejap_trim_memory |
db.trim_memory() — refused: nothing proportional to rows is held |
sekejap_compact |
db.compact() — refused: there is no payload-rewriting compaction |
sekejap_show |
db.show(statement) — refused: collections() and describe() answer as data |
The four refusals keep their names so the reason arrives as a sentence rather
than as an AttributeError.
Service mode
Db.open_service(path) is one writer, parallel readers on a published
snapshot, and the commit-time change feed. Every service call on a
single-mode handle is refused by name.
db = Db.open_service("./data")
subscription = db.subscribe()
db.put("venues", "the_tote", {"name": "The Tote"})
event = db.next_change(subscription, timeout_ms=1000)
print(event["sequence"], event["keys"])
pandas
db.df is a namespace, and pandas is imported only when you touch it.
frame = db.df.query("SELECT _key, name, capacity FROM venues")
db.df.put(frame, "venues") # the index is the key
A shell
python -m sekejap ./data # a prompt
python -m sekejap ./data "SELECT * FROM venues"
Running the tests
SEKEJAP_LIBRARY=/path/to/libsekejap.dylib make test
What changed from 0.16
The 0.16 package was a PyO3 extension module over CoreDB, and its API is
gone rather than renamed:
DB,HitandEdgeHitare gone. A row is addressed by collection and key, not by onecollection/keyslug string, and a query answers plaindictrows keyed by column name.DB()with no argument opened an in-memory database. There is none:sekejap.open_memory()exists only to refuse, by name, with the reason.db.show("SHOW TABLES")is refused;db.collections()anddb.describe(name)answer the same questions as data.trim_memoryandmemory_reportare refused: the buffer pool is bounded at open and there is nothing proportional to rows to give back.FROM MATCH,PATH_*,SHORTESTand the rest of the 0.16 graph dialect are SQL questions now, answered or refused by name bysekejap-lang.
Code written against 0.16 fails at import rather than silently meaning something else.
Release files for sekejap 0.17.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sekejap-0.17.2.tar.gz | 33.6 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| sekejap-0.17.2-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details |
| sekejap-0.17.2-py3-none-manylinux_2_28_x86_64.whl | Python 3 | none | Linux glibc 2.28+ x86-64 | Details |
| sekejap-0.17.2-py3-none-manylinux_2_28_aarch64.whl | Python 3 | none | Linux glibc 2.28+ ARM64 | Details |
| sekejap-0.17.2-py3-none-macosx_11_0_arm64.whl | Python 3 | none | macOS 11.0+ ARM64 | Details |
| sekejap-0.17.2-py3-none-macosx_10_12_x86_64.whl | Python 3 | none | macOS 10.12+ x86-64 | Details |
Total release size: 10.4 MB
Release files / sekejap-0.17.2.tar.gz
| Download URL | sekejap-0.17.2.tar.gz |
|---|---|
| Size | 33.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0e795367a596f5795ac43b2ce6c1704cc40d96c962db400a02f9cb9a5553043b
|
|
BLAKE2b-256 checksum How to use checksums |
e6bbcae6e4ffcf81cb705cea0b48ca8dd89bd610ab0ac8123e250c7f1562046a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 23, 2026.
Transparency logRelease files / sekejap-0.17.2-py3-none-win_amd64.whl
| Download URL | sekejap-0.17.2-py3-none-win_amd64.whl |
|---|---|
| Size | 2.3 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
2f035ecf9c54295cedb3c0d3c77bd352f2d27aed48a349ff0cf2b4282b09894a
|
|
BLAKE2b-256 checksum How to use checksums |
592d02776222b42fec45c170807bcc7463eee4ed2fc923b91ca5e428112c61aa
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 23, 2026.
Transparency logRelease files / sekejap-0.17.2-py3-none-manylinux_2_28_x86_64.whl
| Download URL | sekejap-0.17.2-py3-none-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 2.1 MB |
| Tags | Linux glibc 2.28+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
c6e9747c994c414efd34511d09b5cb0c34750f8b723926b0d03d68d3205c49c5
|
|
BLAKE2b-256 checksum How to use checksums |
69a78a86c593c78a48fb78a8646fa9617ef8cf3b290767cc7d73b2a6e4254e88
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 23, 2026.
Transparency logRelease files / sekejap-0.17.2-py3-none-manylinux_2_28_aarch64.whl
| Download URL | sekejap-0.17.2-py3-none-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 2.0 MB |
| Tags | Linux glibc 2.28+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
252dbfab6d478097b2af8c80e8f3a4acc7552b53127add5d7d340794b1448d10
|
|
BLAKE2b-256 checksum How to use checksums |
bab0983f9bc2a6193836b462c4f0ffdd1d6d384603c66debbf4e2bbfabf360ca
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 23, 2026.
Transparency logRelease files / sekejap-0.17.2-py3-none-macosx_11_0_arm64.whl
| Download URL | sekejap-0.17.2-py3-none-macosx_11_0_arm64.whl |
|---|---|
| Size | 1.9 MB |
| Tags | Python 3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
b0142d6cd0141a9334326fd1b6e349823e6d3995c67189f6477587516454e818
|
|
BLAKE2b-256 checksum How to use checksums |
db163fbe9ee0fde1d090d1e86df9e7edfe9871b9f137e074f372d969ef948fa4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 23, 2026.
Transparency logRelease files / sekejap-0.17.2-py3-none-macosx_10_12_x86_64.whl
| Download URL | sekejap-0.17.2-py3-none-macosx_10_12_x86_64.whl |
|---|---|
| Size | 2.1 MB |
| Tags | Python 3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
f3698e79ab00c2c9aaf4071e8aae07c8b108b648d6ebb669937c879727bb1e42
|
|
BLAKE2b-256 checksum How to use checksums |
f222e627e46b5133db4dd1c3bd6f44a0e52ed7e6cab3d31b612fa2f140e16c37
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 23, 2026.
Transparency log