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.738263        0.430990    1.726277        0.117284
SQLCyCli    sync    50000   2.239658        0.293476    2.341073        0.062193
PyMySQL     sync    50000   2.662151        0.414243    4.245126        0.327544
SQLCyCli    async   50000   3.421401        0.276260    4.336240        0.139700
aiomysql    async   50000   3.579845        0.396187    5.151401        0.322439
asyncmy     async   50000   3.793308        0.409774    5.477049        0.318582
# Unit: second | Lower is better
name        type    rows    update-per-row  update-all  delete-per-row  delete-all
mysqlclient sync    50000   1.768599        0.356437    1.571645        0.108843
SQLCyCli    sync    50000   2.282858        0.368871    2.105368        0.113834
PyMySQL     sync    50000   2.560405        0.346608    2.307289        0.105239
SQLCyCli    async   50000   3.475850        0.346580    3.335821        0.105670
aiomysql    async   50000   3.574864        0.347389    3.261974        0.105169
asyncmy     async   50000   3.762817        0.344875    3.575200        0.106150

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.7.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.7-cp312-cp312-win_arm64.whl (3.6 MB view details)

Uploaded CPython 3.12Windows ARM64

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

Uploaded CPython 3.12Windows x86-64

sqlcycli-1.0.7-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.7-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.7-cp312-cp312-macosx_11_0_arm64.whl (3.9 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.12macOS 10.9+ x86-64

sqlcycli-1.0.7-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.7-cp311-cp311-win_arm64.whl (3.6 MB view details)

Uploaded CPython 3.11Windows ARM64

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

Uploaded CPython 3.11Windows x86-64

sqlcycli-1.0.7-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.7-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.7-cp311-cp311-macosx_11_0_arm64.whl (3.9 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

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

Uploaded CPython 3.11macOS 10.9+ x86-64

sqlcycli-1.0.7-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.7-cp310-cp310-win_arm64.whl (3.6 MB view details)

Uploaded CPython 3.10Windows ARM64

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

Uploaded CPython 3.10Windows x86-64

sqlcycli-1.0.7-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.7-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.7-cp310-cp310-macosx_11_0_arm64.whl (3.9 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

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

Uploaded CPython 3.10macOS 10.9+ x86-64

sqlcycli-1.0.7-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.7.tar.gz.

File metadata

  • Download URL: sqlcycli-1.0.7.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.7.tar.gz
Algorithm Hash digest
SHA256 fa04c2e36e9c67f54d69ebff1e148fc89b616dec9608e8609bf2b3d0e75cf970
MD5 7b431ae0e908a538bd2e2720a0c7e9f2
BLAKE2b-256 3e55908426bac2620ddd7ec7181a04c0926d3dc83c83fe55833d490006bc6aa5

See more details on using hashes here.

File details

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

File metadata

  • Download URL: sqlcycli-1.0.7-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.7-cp312-cp312-win_arm64.whl
Algorithm Hash digest
SHA256 dab27a9333c82c937cf53a3a14bfa684f261eb229511deaec8812e77bad87523
MD5 a950531f42492c736fd04b2d07ebf271
BLAKE2b-256 1f143de518aa5626098bab4866bac738c75af43e855c956251a1d34df01c1e3d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: sqlcycli-1.0.7-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.7-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 cea63cc09855a42dc702c374a00670f68476920b202a96d928988e47dd7c7ed5
MD5 85413a8aae1f7b2897b921c951c66f47
BLAKE2b-256 2564d2ce4b4d77e56d2c20e1301b39169954575e84fb692c7b8f536fb3da3003

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for sqlcycli-1.0.7-cp312-cp312-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 87c42866ed01ef4bf0df1db24484506637ee4b195ab73b0a5eafc562b0c07d8a
MD5 05dd94d413ad7ada8da1d06c0a754594
BLAKE2b-256 7fb826f7b20bc2592180ece11875f1886f54fdb25417fcbc9f6d7d0dccfae3fe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for sqlcycli-1.0.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d8a04d363ec318a5b89415e29c413e00dafe71c7ba86c978c857c42d26ca2f67
MD5 1839953c2f1c684a05163ebda04558f5
BLAKE2b-256 d6703fe2cfb8477f703212bb0f1039f1895db25f33d08b061431236e64027aaf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for sqlcycli-1.0.7-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fb6f1c75f6631ef1a21529ba8f059f92928093402ed86e3153a3d972f09e59e7
MD5 a2a8c8e885f95011ebedf1f981bfda4b
BLAKE2b-256 9f33ad4f5be0ca92256c0aacb5278d9399aa5cfcdb8c98ceb7b9473ba5190ac3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for sqlcycli-1.0.7-cp312-cp312-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 54f227cd7f03c6dc3d7685fe1ad98d5bb1e11cf18998b0bc94797c77754a0677
MD5 9de075da5c808540ff49471266f632aa
BLAKE2b-256 4d21bc629836efe0807ce333bb4a5a461e027fadfdb5b9b7f77fad13f527e573

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for sqlcycli-1.0.7-cp312-cp312-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 ff0cdf398616eaa4fa1e6633ccadfe8aeba0ff058a2cdb59521cc942cd11189c
MD5 a357f4d41bb5187dd83fa85c2b702eb8
BLAKE2b-256 cbb619c3cbb9a72de6883b686014c232ccee04ddacef34f003fa1bce71c1ac21

See more details on using hashes here.

File details

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

File metadata

  • Download URL: sqlcycli-1.0.7-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.7-cp311-cp311-win_arm64.whl
Algorithm Hash digest
SHA256 e6e729aae869bcd0c3c24d8e6b954aac1e9103bc6c54fbae7f0d72c8ba304464
MD5 3dbe6ef6b153e3777c767b8039439f40
BLAKE2b-256 1a4ac0dce79f939682bd7a8fdbb04622ad1c851d03974f7f943e8736f56705d5

See more details on using hashes here.

File details

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

File metadata

  • Download URL: sqlcycli-1.0.7-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.7-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 85a88c4cb8a119dd4f866bb9c250f81e91843750e4d1ef41a1e02c6e221039b3
MD5 182dd79e7a84dd167ee3c6cd0d5e1011
BLAKE2b-256 663751f892b231e0db8176cc964ccab802d7b0cc95a0328e5bbf92d0aadef3a8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for sqlcycli-1.0.7-cp311-cp311-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 47f427cc703ad3a84e7191a2cd924aeb0fa740eeb8518ea56f8ed4d95e1f620b
MD5 6e378017cdba00eb564b060e1aa8abab
BLAKE2b-256 a62b75bdbf9fc9ff362c02be7ef150b2c25e1702b4aabfb46d72c95ce31b5fdb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for sqlcycli-1.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 297822b0fac997814e507a7d69ce07aa8fdf36ebe3be02061a7dc30e747da8f3
MD5 63b2c0a10cf45cec0e5bcac38845c215
BLAKE2b-256 17f105dde859d21e5b98c9dd34cf00ddbc5805e7d372718f00bd46905026ffb2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for sqlcycli-1.0.7-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 02cf7f923214a35b8892b28a8ca5f79db1dd30b6697973edc9a029110b50585e
MD5 5bb15360346218b38819e5885622cfb8
BLAKE2b-256 8123af87f121d20a25a0e356448a6772abfec8ef76518eb6aebae99220f28a34

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for sqlcycli-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d44a9831e736e0990012c0d14902c27236fafe30fe0a6bb7347da0f38a199337
MD5 5f4503c7f11c6ddd3ec5aae3578601d8
BLAKE2b-256 0d97408ce3cc1498e41af68e451afd2fa249969bc7fc73da542c1e3828770d03

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for sqlcycli-1.0.7-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 8f4b22dd82a1faf636598dceeaef0dccf08642180588a373a63f1736d8688f68
MD5 57bee1d8c86d5e6070cb424fe870b761
BLAKE2b-256 d0cb8292867bf4b8222790baa090de510c4ac205bf7b2e0aa842b1fd52b39e51

See more details on using hashes here.

File details

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

File metadata

  • Download URL: sqlcycli-1.0.7-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.7-cp310-cp310-win_arm64.whl
Algorithm Hash digest
SHA256 3a1212fe321e6b4e0dda4357940d6f1315ec6cc589f4b476d54acc19a92d8ec4
MD5 09796be7835773594bb904c8a57801af
BLAKE2b-256 f886e45c8876a678c2a6dce2ddf64da9586e27d38f05b6c1ce9dd2f011ec6a6e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: sqlcycli-1.0.7-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.7-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 999730b0df28d935a6c93116cb49d575e4a7206660df20c57f94b993278b9950
MD5 96af477dec1e773908ddb9f65bbc7b13
BLAKE2b-256 3148d6a68a2589efe4a6c05df3506f040448b8e5bea5f7fa5f4b857411b54797

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for sqlcycli-1.0.7-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 157b5e0e16068a9c28d39984905c083011f74931e7f6e75820f520acd1a07c30
MD5 40d4c4f9d364d0f34efb6b8b3b9103b3
BLAKE2b-256 dc7f299bb77f3bc7aa697d4f549f5483ce1e19f390122b43ba57bd4a07719cff

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for sqlcycli-1.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b6e58f2d8bf4023c160573f7a28a79c029a688076fa24ae78549b3d713b9da40
MD5 36484a37d4ba3afeee292ca942dc9c27
BLAKE2b-256 cb6e5b75550e0bd0fc1ddbe905080964a6835447ca2c7e43de69ddf8bff1647a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for sqlcycli-1.0.7-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8c509aed4ec8d7e7ba5e83d0d61e71d38d7df7dee26c097f7935cf15ea9eba46
MD5 63d1fdcb0b531b41f163feebf9fb0259
BLAKE2b-256 6f0ab42e1720fd54870c21383e291f239e9aa3959b536eef7816029459bd9880

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for sqlcycli-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4dbf07d95b68ca30ad92e7a64f95771dbfc33db4503bf46f2e548882d745e243
MD5 7c8dadb83fc27b712f1f278ec7ec8cf5
BLAKE2b-256 2445278b25c216450fe166ee3f7d543484e185f972730540ba6baedf006b1090

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for sqlcycli-1.0.7-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 69ed096fc47ff63d7b2a97fb8a67cd961438d1e836d08bdba9b0fdd471a93e94
MD5 01c13c3e063a3a7d95b1359400777c09
BLAKE2b-256 a9de76e0524fe7c3174eec4b29fe3327206b6acae52b9be39af65b0ec2bd23c1

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