Skip to main content

Fast MySQL driver build in Cython (Sync and Async).

Project description

Fast MySQL driver build in Cython (Sync and Async).

Created to be used in a project, this package is published to github for ease of management and installation across different modules.

Installation

Install from PyPi

pip install sqlcycli

Install from github

pip install git+https://github.com/AresJef/SQLCyCli.git

For Linux systems, if you encounter the following error when installing the SQLCyCli dependency mysqlclient:

Exception: Can not find valid pkg-config name.
Specify MYSQLCLIENT_CFLAGS and MYSQLCLIENT_LDFLAGS env vars manually

Try the following to fix dependency issue (source: Stack Overflow):

sudo apt-get install pkg-config python3-dev default-libmysqlclient-dev build-essential

Requirements

  • Python 3.10 or higher.
  • MySQL 5.5 or higher.

Features

  • Written in Cython for optimal performance (especially for SELECT/INSERT query).
  • All classes and methods are well documented and type annotated.
  • Supports both Sync and Async connection to the server.
  • API Compatiable with PyMySQL and aiomysql.
  • Support conversion (escape) for most of the native python types, and objects from libaray numpy and pandas. Does NOT support custom conversion (escape).

Benchmark

The following result comes from benchmark:

  • Device: MacbookPro M1Pro(2E8P) 32GB
  • Python: 3.12.4
  • MySQL: 8.3.0
  • mysqlclient: 2.2.4
  • PyMySQL: 1.1.1
  • aiomysql: 0.2.0
  • asyncmy: 0.2.9
# Unit: second | Lower is better
name        type    rows    insert-per-row  insert-bulk select-per-row  select-all
mysqlclient sync    50000   1.729575        0.435661    1.719481        0.117943
SQLCyCli    sync    50000   2.165910        0.275736    2.215093        0.056679
PyMySQL     sync    50000   2.553401        0.404618    4.212548        0.325706
SQLCyCli    async   50000   3.347850        0.282364    4.153874        0.135656
aiomysql    async   50000   3.478428        0.394711    5.101733        0.321200
asyncmy     async   50000   3.665675        0.397671    5.483239        0.313418
# Unit: second | Lower is better
name        type    rows    update-per-row  update-all  delete-per-row  delete-all
mysqlclient sync    50000   1.735787        0.345561    1.531275        0.105109
SQLCyCli    sync    50000   2.241458        0.343359    2.078324        0.104441
PyMySQL     sync    50000   2.516349        0.344614    2.264735        0.104326
SQLCyCli    async   50000   3.465996        0.343864    3.269337        0.103967
aiomysql    async   50000   3.534125        0.344573    3.345815        0.104281
asyncmy     async   50000   3.695764        0.352104    3.460674        0.104523

Usage

Use connect() to create one connection (Sync or Async) to the server.

import asyncio
import sqlcycli

HOST = "localhost"
PORT = 3306
USER = "root"
PSWD = "password"

# Synchronous Connection
def test_sync_connection() -> None:
    with sqlcycli.connect(HOST, PORT, USER, PSWD) as conn:
        with conn.cursor() as cur:
            cur.execute("SELECT 1")
            res = cur.fetchone()
            assert res == (1,)
    # Connection closed
    assert conn.closed()

# Asynchronous Connection
async def test_async_connection() -> None:
    async with sqlcycli.connect(HOST, PORT, USER, PSWD) as conn:
        async with conn.cursor() as cur:
            await cur.execute("SELECT 1")
            res = await cur.fetchone()
            assert res == (1,)
    # Connection closed
    assert conn.closed()

if __name__ == "__main__":
    test_sync_connection()
    asyncio.run(test_async_connection())

Use create_pool() to create a Pool for managing and maintaining Async connections to the server.

import asyncio
import sqlcycli

HOST = "localhost"
PORT = 3306
USER = "root"
PSWD = "password"

# Pool (Context Manager: Connected)
async def test_pool_context_connected() -> None:
    async with sqlcycli.create_pool(HOST, PORT, USER, PSWD, min_size=1) as pool:
        # Pool is connected: 1 free connection (min_size=1)
        assert not pool.closed() and pool.free == 1
        async with pool.acquire() as conn:
            async with conn.cursor() as cur:
                await cur.execute("SELECT 1")
                res = await cur.fetchone()
                assert res == (1,)
    # Pool closed
    assert pool.closed() and pool.total == 0

# Pool (Context Manager: Disconnected)
async def test_pool_context_disconnected() -> None:
    with sqlcycli.create_pool(HOST, PORT, USER, PSWD, min_size=1) as pool:
        # Pool is not connected: 0 free connection (min_size=1)
        assert pool.closed() and pool.free == 0
        # Connect automatically
        async with pool.acquire() as conn:
            async with conn.cursor() as cur:
                await cur.execute("SELECT 1")
                res = await cur.fetchone()
                assert res == (1,)
        # 1 free connection
        assert pool.free == 1
    # Pool closed
    assert pool.closed() and pool.total == 0

# Pool (Create Directly: Connected)
async def test_pool_direct_connected() -> None:
    pool = await sqlcycli.create_pool(HOST, PORT, USER, PSWD, min_size=1)
    # Pool is connected: 1 free connection (min_size=1)
    assert not pool.closed() and pool.free == 1
    async with pool.acquire() as conn:
        async with conn.cursor() as cur:
            await cur.execute("SELECT 1")
            res = await cur.fetchone()
            assert res == (1,)
    # Close pool manually
    await pool.close()
    assert pool.closed() and pool.total == 0

if __name__ == "__main__":
    asyncio.run(test_pool_context_connected())
    asyncio.run(test_pool_context_disconnected())
    asyncio.run(test_pool_direct_connected())

Acknowledgements

SQLCyCli is build on top of the following open-source repositories:

SQLCyCli is based on the following open-source repositories:

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

sqlcycli-1.0.8.tar.gz (2.5 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

sqlcycli-1.0.8-cp312-cp312-win_arm64.whl (3.6 MB view details)

Uploaded CPython 3.12Windows ARM64

sqlcycli-1.0.8-cp312-cp312-win_amd64.whl (3.8 MB view details)

Uploaded CPython 3.12Windows x86-64

sqlcycli-1.0.8-cp312-cp312-musllinux_1_1_x86_64.whl (11.7 MB view details)

Uploaded CPython 3.12musllinux: musl 1.1+ x86-64

sqlcycli-1.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.7 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

sqlcycli-1.0.8-cp312-cp312-macosx_11_0_arm64.whl (3.9 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

sqlcycli-1.0.8-cp312-cp312-macosx_10_9_x86_64.whl (4.0 MB view details)

Uploaded CPython 3.12macOS 10.9+ x86-64

sqlcycli-1.0.8-cp312-cp312-macosx_10_9_universal2.whl (5.4 MB view details)

Uploaded CPython 3.12macOS 10.9+ universal2 (ARM64, x86-64)

sqlcycli-1.0.8-cp311-cp311-win_arm64.whl (3.6 MB view details)

Uploaded CPython 3.11Windows ARM64

sqlcycli-1.0.8-cp311-cp311-win_amd64.whl (3.9 MB view details)

Uploaded CPython 3.11Windows x86-64

sqlcycli-1.0.8-cp311-cp311-musllinux_1_1_x86_64.whl (11.8 MB view details)

Uploaded CPython 3.11musllinux: musl 1.1+ x86-64

sqlcycli-1.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.7 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

sqlcycli-1.0.8-cp311-cp311-macosx_11_0_arm64.whl (3.9 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

sqlcycli-1.0.8-cp311-cp311-macosx_10_9_x86_64.whl (4.1 MB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

sqlcycli-1.0.8-cp311-cp311-macosx_10_9_universal2.whl (5.4 MB view details)

Uploaded CPython 3.11macOS 10.9+ universal2 (ARM64, x86-64)

sqlcycli-1.0.8-cp310-cp310-win_arm64.whl (3.6 MB view details)

Uploaded CPython 3.10Windows ARM64

sqlcycli-1.0.8-cp310-cp310-win_amd64.whl (3.9 MB view details)

Uploaded CPython 3.10Windows x86-64

sqlcycli-1.0.8-cp310-cp310-musllinux_1_1_x86_64.whl (11.0 MB view details)

Uploaded CPython 3.10musllinux: musl 1.1+ x86-64

sqlcycli-1.0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.0 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

sqlcycli-1.0.8-cp310-cp310-macosx_11_0_arm64.whl (3.9 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

sqlcycli-1.0.8-cp310-cp310-macosx_10_9_x86_64.whl (4.1 MB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

sqlcycli-1.0.8-cp310-cp310-macosx_10_9_universal2.whl (5.4 MB view details)

Uploaded CPython 3.10macOS 10.9+ universal2 (ARM64, x86-64)

File details

Details for the file sqlcycli-1.0.8.tar.gz.

File metadata

  • Download URL: sqlcycli-1.0.8.tar.gz
  • Upload date:
  • Size: 2.5 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.5

File hashes

Hashes for sqlcycli-1.0.8.tar.gz
Algorithm Hash digest
SHA256 b45ccae4f7b889db16cb3107f1f6b137518f76c5eb1e763107321c9d28282904
MD5 94ea4f11b679971ee6bce8860265d5a7
BLAKE2b-256 c791a7da35894a7491ebba45540ce4e112c5a3d1e2d16531317106a0e9c7652e

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.8-cp312-cp312-win_arm64.whl.

File metadata

  • Download URL: sqlcycli-1.0.8-cp312-cp312-win_arm64.whl
  • Upload date:
  • Size: 3.6 MB
  • Tags: CPython 3.12, Windows ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.5

File hashes

Hashes for sqlcycli-1.0.8-cp312-cp312-win_arm64.whl
Algorithm Hash digest
SHA256 5ea4b5a664a5d217bdc9a361f964220eb3e688a9ccdf4451535c6a25e723f7f1
MD5 0df19aca94a39f1da28b6efad853bdfa
BLAKE2b-256 c4c677eb466253a730e8822fed4916853aee57e514f30688ac3badf70a772cb4

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.8-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: sqlcycli-1.0.8-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 3.8 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.5

File hashes

Hashes for sqlcycli-1.0.8-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 423eb6e2fbd3f3ff9fa48afc8b45eee06b58c38a2cf018863e11a604764323cc
MD5 80ffb23b036050e270a03be9a0c36112
BLAKE2b-256 fbedae1c10f94c0a9fdf8d7aaa2896fe70dc70ec508dbd24690072c64d200d86

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.8-cp312-cp312-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for sqlcycli-1.0.8-cp312-cp312-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 c27cfe636a283b1cb64506e5648ef6447f3b6fc5f82b1dd6b6cd9555c92b54ee
MD5 3fed98c3f2172e7d77ebda1829d0a0c3
BLAKE2b-256 5e9ebb2a64b9cc3d9aae698530dfff88e67482663f6f5e56ce8fb2ce787d5696

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for sqlcycli-1.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6db49731c51ea92fdb024ad4bc74b8a34047696e2f4c849635c6b5e0a9d11b11
MD5 4452e8203e10da579d337741255302f2
BLAKE2b-256 80d0a4bc67fe3a9509e769c5d4ea91f6608f3644c574bf84183a9e321c3709ef

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.8-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for sqlcycli-1.0.8-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 eb335c1bade1edf1fa68da071d2bf78815294c448b12b9543f83e62e7f244ecc
MD5 1f8a1249604c8539f1c397483431bab9
BLAKE2b-256 f1717daa289ecbda05032973a45f359d21c0692da9b873376daa011260150223

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.8-cp312-cp312-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for sqlcycli-1.0.8-cp312-cp312-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 8ea749ad1991f57798d91c1bc53e45fdee9d3d0129a85a35de0d2c9f8c1d8522
MD5 a745748dcb28ed0a77f1cde4a65e8a1d
BLAKE2b-256 c7fc70db8fbe255f230418b84fcaf47dc4a7941cbb6ec2a04920f41b448d006e

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.8-cp312-cp312-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for sqlcycli-1.0.8-cp312-cp312-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 ad36815f1fb9f8972e82797508a6d352d5d2a56c97c989ab3e15c87105672b23
MD5 b225882d53d5cbafcaacde47088bdc9c
BLAKE2b-256 7aadc59d26180908e8d99391583fb45b23801ac02a3c763b6e887ea43d525bde

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.8-cp311-cp311-win_arm64.whl.

File metadata

  • Download URL: sqlcycli-1.0.8-cp311-cp311-win_arm64.whl
  • Upload date:
  • Size: 3.6 MB
  • Tags: CPython 3.11, Windows ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.5

File hashes

Hashes for sqlcycli-1.0.8-cp311-cp311-win_arm64.whl
Algorithm Hash digest
SHA256 9da6ab0f67f235b7cd5f8bd2eedeed4eb2eb2e748c96dccabab062909037cd7c
MD5 7c415148565cee075c2653f3173b2b80
BLAKE2b-256 50d401b52f747a901b8ab82c2ff2a89eb5f8e63eb762fee7c5f111c14b887fce

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.8-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: sqlcycli-1.0.8-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 3.9 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.5

File hashes

Hashes for sqlcycli-1.0.8-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 760093b6d2778e6e19d73c5de944577e8ca5c702ab0871c86217a7cde1c79914
MD5 2f52be9a56a1cf6c1e9821de13da9726
BLAKE2b-256 a3dd62290804f3f338e79e99624d24a2d3ad01b2f5e5e08da4bd3f5851af0cc9

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.8-cp311-cp311-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for sqlcycli-1.0.8-cp311-cp311-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 3656a3e9f28e2a64431350ba91cce14841894e794e9d8083db08b51394eded8d
MD5 a632dad87f7e0f183d8fac35c3ff7066
BLAKE2b-256 4aafc99f19d2ebd73ffdb71186c2438f656deef7df5306e45a8b3a3f729910c0

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for sqlcycli-1.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c9b5431206689bb55766c85242c590ab1bb4ece5043a1a36af0c73776030a7b8
MD5 5ea3a9df4dcadd132f9d0ba344e98330
BLAKE2b-256 9c9d1f1e4d89e943b80eaf97b0b5faa4ed67818f2ccbfdeb4b954c8ff0963734

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.8-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for sqlcycli-1.0.8-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 26bc46e7cbf500aed56a0eafe5d976f172ac7ef4fda717962054fe32533d1881
MD5 8af5d46da6de95035b76c8d7d572205f
BLAKE2b-256 5672fbf7d3dd731bf0106111428a48235b5f342dcb57b248493b84a543624893

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.8-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for sqlcycli-1.0.8-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 437e68db9c185b67701255a9a4e7f675f2299d8bac3fcafc900b6cdf2022ecfe
MD5 6f6851ed64d412a472decd7ee331e90b
BLAKE2b-256 bad29986a67f03dd9357db4d6cffacea4140ce6763ee9e4852f8b34ccb379608

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.8-cp311-cp311-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for sqlcycli-1.0.8-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 2ec1f0a31713fd3ff62f7fbc5ed5c5498f7879025fd8dfe791300cc4cb043833
MD5 8146a4ca061378c1ba4b0d74e7bc0fa6
BLAKE2b-256 3722fbe069ce99b3ca89d65790f5b892784b54cf5d47b5e82616f17085c80054

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.8-cp310-cp310-win_arm64.whl.

File metadata

  • Download URL: sqlcycli-1.0.8-cp310-cp310-win_arm64.whl
  • Upload date:
  • Size: 3.6 MB
  • Tags: CPython 3.10, Windows ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.5

File hashes

Hashes for sqlcycli-1.0.8-cp310-cp310-win_arm64.whl
Algorithm Hash digest
SHA256 af12c4683cc192bab3191df794e71849a526c50649607a7c4c7c1b00c52cb1c2
MD5 71a6ddb22b6b0e6948a1ac1a5d74c56e
BLAKE2b-256 56d50a622aa7af83780aa58cfae7517f0b16a0ba4c7c3e8bcfa594ba302a382b

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.8-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: sqlcycli-1.0.8-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 3.9 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.5

File hashes

Hashes for sqlcycli-1.0.8-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 0dab0af44b3040f09cfd6a9455462609142f7190e2aed0aa30f8ae7157102a32
MD5 9cd403c6b27ac9cd897e12fe8059d566
BLAKE2b-256 b9490c276e8308faaf0385f2fb885ce194930d2939dad8e83c2b1640e29b9f21

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.8-cp310-cp310-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for sqlcycli-1.0.8-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 8313b63256e873771f51cb1ee4b0fdbff591b5183e4333f6040a983635e69e4a
MD5 1b5dc86ff9da065f441af5acec3db19f
BLAKE2b-256 80958c3c5a51b7ec91d02969a15582fc76332fd2b8ae7302966d5c09dc1353af

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for sqlcycli-1.0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b8b7df58d9a093549ded75f21f3a064729ac71fc2638a5b1a1a8609a240b9cfc
MD5 b10549f3629aa88f9f2130fd2020474a
BLAKE2b-256 fa6f34384b42ad0968cd70269ecee323be31b13fcefe9c5eb98432ec250ecb47

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.8-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for sqlcycli-1.0.8-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 87c717fc5ce19531d73dcf917c398f13264e8a15ceb63f369c5394cd8b7425b6
MD5 c91b0d03e5ecfd0cc412d246b9d82dfb
BLAKE2b-256 b06d21ec29c559d91439b65a7a12a60d823b515cf608c19ef99776e607551089

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.8-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for sqlcycli-1.0.8-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d3749a2356b8d119f542f550516123a90a290e494a95ed1f735947310172f3ac
MD5 25a8bd1b93571265164b21d200d1c3ee
BLAKE2b-256 f0a73b7e318980089aaec68d20db19a5655338d7b18e85f004d486e85ea208e2

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.8-cp310-cp310-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for sqlcycli-1.0.8-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 253f1a20dd3925ea38c66b4e4de8e51d746b15ebaf0f17b3da7d0f756de52cab
MD5 54bcc520a53a2f371fd94f20e00735b8
BLAKE2b-256 43b6b9b6a4e8a9caa29d66af59588b6958e388538abf9441725474ba3526ae2a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page