without-durability-postgres
without-durability's two
interfaces over one Postgres: three tables, and no mechanism of its own.
from psycopg_pool import AsyncConnectionPool
from without_durability_postgres import PostgresCheckpointer, PostgresDurable, PostgresScheduler, migrate
pool = AsyncConnectionPool(dsn, open=False)
await pool.open(wait=True)
await migrate(pool)
durable = PostgresDurable(PostgresCheckpointer(pool=pool), PostgresScheduler(pool=pool))
What is worth reading this package for is how little of it is mechanism. Every
write the Redis store needs a Lua script for is one statement here, or one
transaction, and neither is something this package supplies. Redis needs scripts
because it has no way to say "check this, then write that, and let nobody in
between"; SQL says it by default. The claim is an upsert whose DO UPDATE carries
a WHERE on the lease; the fenced record is one statement whose FOR UPDATE CTE
serializes it against a claim in flight; the queue takes with
FOR UPDATE SKIP LOCKED, so several workers polling one table fan out instead of
queueing on its head.
Three things that are live questions over Redis do not arise. A workflow id is a
query parameter rather than key structure, so it carries no constraints at all.
Nothing expires, so the TTL that can lose a suspended workflow is gone, and the
fencing token can be an ordinary counter. And a default Postgres commits
synchronously, so record returning means what the durable runner assumes it
means.
SqlEffect is a callback handed a cursor inside the open transaction, so a step's
own business write and its checkpoint commit together: exactly-once for that step,
over the application's own tables. PostgresDurable extends that to the interface
above, committing a value's arrival and the workflow's wakeup at once, which is
what makes "you need no second system" a claim this can actually make. It is also
where "one datastore" stops meaning "Postgres", since a transaction is local only
on a single node.
See the
without-durability-postgres guide
(with the API reference)
for the statements, the schema, what co-location a sharded deployment owes, and
what a deployment still owes anyway (a sweep, and a real migration tool).
Metadata
Release files for without-durability-postgres 0.0.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| without_durability_postgres-0.0.5.tar.gz | 14.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| without_durability_postgres-0.0.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 31.0 kB
Release files / without_durability_postgres-0.0.5.tar.gz
| Download URL | without_durability_postgres-0.0.5.tar.gz |
|---|---|
| Size | 14.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
657beec10347a3027ffe98c98f0bfe41990265a962eeef53fec381f47949abf7
|
|
BLAKE2b-256 checksum How to use checksums |
83c45aab66b7471a905576b69929e2460cbc86fa587407afa71d81159af134e1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / without_durability_postgres-0.0.5-py3-none-any.whl
| Download URL | without_durability_postgres-0.0.5-py3-none-any.whl |
|---|---|
| Size | 16.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
831fbe47e71838b09f296b68e7ad3d7c81b5a574897f889c9632fdda10a00c32
|
|
BLAKE2b-256 checksum How to use checksums |
d33e7497577d1fb8829a4b2b8d734444fbb0b95b611297b57f61d65b7e79d897
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|