Python implementation of structured URI query language
Project description
pysquril
PYthon Structured URI Query Language. A library for implementing versioned, queryable, and auditable document oriented datastores. Features:
- Useful for implementing generic document oriented REST APIs
- Multi-tenancy
- Enforces uniqueness on records, otherwise schemaless
- SQL-like query language
- features:
- selecting keys
- aggregation functions
- group by
- filtering rows
- ordering
- pagination
- Examples
- EBNF
- Railroad diagrams
- helper class to experiment with queries
- features:
- Ability to apply queries to multiple tables (document sets) simultaneously
- Audit (with rollback) - who, what, when, why
- default events: update, delete
- optional events: create, read
- PostgreSQL and sqlite database backends
Getting to know pysquril
Use the helper class to run interactive queries on your own input data:
pysquril % poetry run python
>>> from pysquril.interactive import B
>>> B().D([{"x": 0, "y": 1}, {"x": 100, "y": 4, "z": [1,2]}]).Q("select=x,z[1]")
[[0, None], [100, 2]]
>>> B().D([{"x": 0, "y": 1}, {"x": 100, "y": 4, "z": [1,2]}]).Q("select=x,z[1]&order=x.desc")
[[100, 2], [0, None]]
>>> B().D([{"x": 0, "y": 1}, {"x": 100, "y": 4, "z": [1,2]}]).Q("select=x,z[1]&where=y=gt.1")
[[100, 2]]
Example library usage
import sqlite3
from pysquril.backends import SqliteBackend, sqlite_init
# get a connection pool
# most real world usage would use persistent storage
engine = sqlite_init(":memory:")
# instantiate a backend, for a given tenant, and identity
tenant = "tenant1"
backend = SqliteBackend(
engine,
schema=tenant,
requestor="some-user",
requestor_name="Some Person Name",
)
# add some data
table = "mytable"
backend.table_insert(
table_name=table,
data={"saying": "good", "being": ["glad"], "id": 0},
)
backend.table_insert(
table_name=table,
data={"saying": "good", "being": ["content", "detached"], "id": 1},
)
# query the data
print(list(backend.table_select(table_name=table, uri_query="select=being")))
# change the second record, with a reason
reason_for_update = "a more accurate description"
backend.table_update(
table_name=table,
uri_query=f"set=saying&where=being[0]=eq.'content'&message='{reason_for_update}'",
data={"saying": "excellent"},
)
# check the audit
print(list(backend.table_select(table_name=f"{table}_audit", uri_query="")))
# restore the data to its prior state
backend.table_restore(
table_name=table,
uri_query="restore&primary_key=id",
)
# check that the data is back to its original state
result = list(
backend.table_select(
table_name=table,
uri_query="select=saying&where=being[0]=eq.'content'",
)
)
assert result[0][0] == "good"
Tests
poetry install
poetry run pytest -vs --durations=0 pysquril/tests.py
Generating docs
npm install -g ebnf2railroad
ebnf2railroad pysquril/docs/grammar.ebnf -o pysquril/docs/grammar.html
License
BSD.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
pysquril-1.0.1.tar.gz
(27.4 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
pysquril-1.0.1-py3-none-any.whl
(29.1 kB
view details)
File details
Details for the file pysquril-1.0.1.tar.gz.
File metadata
- Download URL: pysquril-1.0.1.tar.gz
- Upload date:
- Size: 27.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e83fbf03ae10e9e262bdcc15cb3392c7dc0c52c284aec7f806d830acd34e8b92
|
|
| MD5 |
c44dcf5d2f5f9fa4e7157888b971d0f3
|
|
| BLAKE2b-256 |
f0519d3266000a5a2fc1c6f3bbc8988ab0aedd2cd103ecb3cee8b5d831f467da
|
File details
Details for the file pysquril-1.0.1-py3-none-any.whl.
File metadata
- Download URL: pysquril-1.0.1-py3-none-any.whl
- Upload date:
- Size: 29.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
76fe62879a13fcfd3b1814e00338595d1b3a43394158a54f054244ffd0895220
|
|
| MD5 |
cfcc44776e8985ba8913dee2e1c489af
|
|
| BLAKE2b-256 |
0e48bc2b1b1fc045c22b1470514908ea9ec65ba53c179893f6a7234fc1673726
|