A distributed lock implementation based on SQLAlchemy
Project description
sqlalchemy-dlock
sqlalchemy-dlock is a distributed-lock library based on Database and SQLAlchemy.
It currently supports below locks:
| Database | Lock |
|---|---|
| MySQL | named lock |
| PostgreSQL | advisory lock |
Install
pip install sqlalchemy-dlock
Usage
-
Work with SQLAlchemy
Connection:from sqlalchemy import create_engine from sqlalchemy_dlock import create_sadlock key = 'user/001' engine = create_engine('postgresql://scott:tiger@127.0.0.1/') conn = engine.connect() # Create the D-Lock on the connection lock = create_sadlock(conn, key) # it's not lock when constructed assert not lock.locked # lock lock.acquire() assert lock.locked # un-lock lock.release() assert not lock.locked
-
withstatementfrom contextlib import closing from sqlalchemy import create_engine from sqlalchemy_dlock import create_sadlock key = 'user/001' engine = create_engine('postgresql://scott:tiger@127.0.0.1/') with engine.connect() as conn: # Create the D-Lock on the connection with create_sadlock(conn, key) as lock: # It's locked assert lock.locked # Auto un-locked assert not lock.locked # If do not want to be locked in `with`, a `closing` wrapper may help with closing(create_sadlock(conn, key)) as lock2: # It's NOT locked here !!! assert not lock2.locked # lock it now: lock2.acquire() assert lock2.locked # Auto un-locked assert not lock2.locked
-
Work with SQLAlchemy
ORMSession:from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from sqlalchemy_dlock import create_sadlock key = 'user/001' engine = create_engine('postgresql://scott:tiger@127.0.0.1/') Session = sessionmaker(bind=engine) with Session() as session: with create_sadlock(session, key) as lock: assert lock.locked assert not lock.locked
-
Asynchronous I/O Support
💡 TIP
- SQLAlchemy
1.x's asynchronous I/O: https://docs.sqlalchemy.org/14/orm/extensions/asyncio.html - SQLAlchemy
2.x's asynchronous I/O: https://docs.sqlalchemy.org/20/orm/extensions/asyncio.html
from sqlalchemy.ext.asyncio import create_async_engine from sqlalchemy_dlock import create_async_sadlock key = 'user/001' engine = create_async_engine('postgresql+asyncpg://scott:tiger@127.0.0.1/') async with engine.connect() as conn: async with create_async_sadlock(conn, key) as lock: assert lock.locked await lock.release() assert not lock.locked await lock.acquire() assert not lock.locked
ℹ️ NOTE
aiomysql, asyncpg and psycopg are tested asynchronous drivers. - SQLAlchemy
Test
Following drivers are tested:
- MySQL:
- mysqlclient (synchronous)
- pymysql (synchronous)
- aiomysql (asynchronous)
- Postgres:
You can run unit-tests
-
on local environment:
-
Install the project in editable mode with
asynciooptional dependencies, and libraries/drivers needed in test. A virtual environment (venv) is strongly advised:pip install -e . --group dev
-
start up mysql and postgresql service
There is a docker compose file
db.docker-compose.ymlin project's top directory, which can be used to run mysql and postgresql develop environment conveniently:docker compose -f db.docker-compose.yml up
-
set environment variables
TEST_URLSandTEST_ASYNC_URLSfor sync and async database connection url. Multiple connections separated by space.eg: (following values are also the defaults, and can be omitted)
TEST_URLS=mysql://test:test@127.0.0.1/test postgresql://postgres:test@127.0.0.1/ TEST_ASYNC_URLS=mysql+aiomysql://test:test@127.0.0.1/test postgresql+asyncpg://postgres:test@127.0.0.1/
ℹ️ NOTE
The test cases would load environment variables from dot-env filetests/.env. -
run unit-test
python -m unittest
-
-
or on docker compose:
tests/docker-compose.ymldefines a Python and SQLAlchemy version matrix -- it combines multiple Python versions and SQLAlchemyv1/v2for test cases. We can run it by:cd tests docker compose up --abort-on-container-exit
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
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
File details
Details for the file sqlalchemy_dlock-0.7.0.tar.gz.
File metadata
- Download URL: sqlalchemy_dlock-0.7.0.tar.gz
- Upload date:
- Size: 18.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9c5467946ff6bf96f472a71690b49ee24240de1a637ef636d050b80fe4cdfc0a
|
|
| MD5 |
a0b0d6d4edc60d03c35160cebf089ac4
|
|
| BLAKE2b-256 |
96b2ef20875e2385262b4b5fc9c749d927f8d25a8de33b3a1270e1ef7122d2f5
|
File details
Details for the file sqlalchemy_dlock-0.7.0-py3-none-any.whl.
File metadata
- Download URL: sqlalchemy_dlock-0.7.0-py3-none-any.whl
- Upload date:
- Size: 17.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cd979ab24c3002f0001bea2dae5cce3d7ce868bf5f2a8aa2c4d5e1f5f87301ec
|
|
| MD5 |
b87a466a2a75a3882cfa2c48f88a993f
|
|
| BLAKE2b-256 |
30ae0940c9f45206af5554242604a278642f7a464613d1b6aa9fedc95f421bdf
|