High-performance MySQL driver for Python
Project description
pyro-mysql
A high-performance MySQL driver for Python, backed by Rust.
Usage
0. Import
# Async
from pyro_mysql.async_ import Conn
from pyro_mysql import AsyncConn
# Sync
from pyro_mysql.sync import Conn
from pyro_mysql import SyncConn
1. Connection
from pyro_mysql.async_ import Conn
from pyro_mysql import Opts
async def example():
conn1 = await Conn.new(f"mysql://{USER}:{PASSWORD}@{HOST}:{PORT}/{DATABASE}")
conn2 = await Conn.new(
Opts(f"mysql://{USER}:{PASSWORD}@localhost")
.tcp_nodelay(False)
)
conn3 = await Conn.new(
Opts()
.socket("../unix.socket")
.user("username")
.db("db")
)
2. Query Execution
SyncConn and AsyncConn provides the following 8 methods (SyncConn doesn't return Awaitable):
# Text Protocols - supports multiple statements concatenated with ';' but accepts no argument
def query(self, query: str, *, as_dict: bool = False) -> Awaitable[list[tuple] | list[dict]]: ...
def query_first(self, query: str, *, as_dict: bool = False) -> Awaitable[tuple | dict | None]: ...
def query_drop(self, query: str) -> Awaitable[None]: ...
# Binary Protocols - supports arguments but no multiple statement
def exec(self, query: str, params: Params = None, *, as_dict: bool = False) -> Awaitable[list[tuple] | list[dict]]: ...
def exec_first(self, query: str, params: Params = None, *, as_dict: bool = False) -> Awaitable[tuple | dict | None]: ...
def exec_drop(self, query: str, params: Params = None) -> Awaitable[None]: ...
def exec_batch(self, query: str, params: Sequence[Params] = []) -> Awaitable[None]: ...
def exec_bulk_insert_or_update(self, query: str, params: Sequence[Params] = [], *, as_dict: bool = False) -> Awaitable[list[tuple] | list[dict]]: ...
# Examples
rows = await conn.exec("SELECT * FROM my_table WHERE a=? AND b=?", (a, b)) # returns list of tuples
rows_as_dicts = await conn.exec("SELECT * FROM my_table WHERE a=? AND b=?", (a, b), as_dict=True) # returns list of dicts
await conn.exec_batch("SELECT * FROM my_table WHERE a=? AND b=?", [(a1, b1), (a2, b2)])
Awaitable is a coroutine or PyroFuture, which is a Future-like object that tracks a task in the Rust thread. If the returned object is dropped before completion or cancellation, the corresponding task in the Rust thread is cancelled as well.
3. Transaction
# async API
async with conn.start_transaction() as tx:
await conn.exec('INSERT ..')
await conn.exec('INSERT ..')
await tx.commit()
# sync API
with conn.start_transaction() as tx:
conn.exec('INSERT ..')
conn.exec('INSERT ..')
tx.rollback()
DataType Mapping
Python -> MySQL
| Python Type | MySQL Binary Protocol Encoding |
|---|---|
None |
NULL |
bool |
Int64 |
int |
Int64 |
float |
Double(Float64) |
str | bytes | bytearray |
Bytes |
tuple | list | set | frozenset | dict |
json-encoded string as Bytes |
datetime.datetime |
Date(year, month, day, hour, minute, second, microsecond) |
datetime.date |
Date(year, month, day, 0, 0, 0, 0) |
datetime.time |
Time(false, 0, hour, minute, second, microsecond) |
datetime.timedelta |
Time(is_negative, days, hours, minutes, seconds, microseconds) |
time.struct_time |
Date(year, month, day, hour, minute, second, 0) |
decimal.Decimal |
Bytes(str(Decimal)) |
uuid.UUID |
Bytes(UUID.hex) |
MySQL -> Python
| MySQL Column | Python |
|---|---|
NULL |
None |
INT / TINYINT / SMALLINT / MEDIUMINT / BIGINT / YEAR |
int |
FLOAT / DOUBLE |
float |
DECIMAL / NUMERIC |
decimal.Decimal |
DATE |
datetime.date or None (0000-00-00) |
DATETIME / TIMESTAMP |
datetime.datetime or None (0000-00-00 00:00:00) |
TIME |
datetime.timedelta |
CHAR / VARCHAR / TEXT / TINYTEXT / MEDIUMTEXT / LONGTEXT |
str |
BINARY / VARBINARY / BLOB / TINYBLOB / MEDIUMBLOB / LONGBLOB |
bytes |
JSON |
str or the result of json.loads() |
ENUM / SET |
str |
BIT |
bytes |
GEOMETRY |
bytes |
Logging
pyro-mysql sends the Rust logs to the Python logging system, which can be configured with logging.getLogger("pyro_mysql").
# Queries are logged with the DEBUG level
logging.getLogger("pyro_mysql").setLevel(logging.DEBUG)
PEP-249, sqlalchemy
pyro_mysql.dbapi implements PEP-249.
This only exists for compatibility with ORM libraries.
The primary API set (pyro_mysql.sync, pyro_mysql.async_) is simpler and faster.
pyro_mysql.dbapi
# classes
├─Connection
├─Cursor
# exceptions
├─Warning
├─Error
├─IntegrityError
├─..
In sqlalchemy, the following dialects are supported.
mysql+pyro_mysql://(sync)mariadb+pyro_mysql://(sync)mysql+pyro_mysql_async://(async)mariadb+pyro_mysql_async://(async)
Connection options can be configured using the Opts builder class. See pyro_mysql.Opts for available options.
from sqlalchemy import create_engine, text
engine = create_engine("mysql+pyro_mysql://test:1234@localhost/test")
conn = engine.connect()
cursor_result = conn.execute(text("SHOW TABLES"))
for row in cursor_result:
print(row)
('information_schema',)
('mysql',)
('performance_schema',)
('sys',)
('test',)
To run sqlalchemy tests on pyro_mysql, use this command in the sqlalchemy repo:
pytest -p pyro_mysql.testing.sqlalchemy_pytest_plugin --dburi=mariadb+pyro_mysql://test:1234@localhost/test -v t
sqlalchemy_pytest_plugin is required to skip incompatible tests.
API Overview
- pyro_mysql
- pyro_mysql,sync
- pyro_mysql.async_
- pyro_mysql.dbapi
- pyro_mysql.dbapi_async
- pyro_mysql.error
There is no auto-generated API Reference. *.pyi files are manually synced.
.
└── pyro_mysql/
├── (common classes)/
│ ├── Opts
│ ├── BufferPool
│ ├── IsolationLevel
│ ├── CapabilityFlags
│ └── PyroFuture
├── sync/
│ ├── Conn
│ └── Transaction
├── async_/
│ ├── Conn
│ └── Transaction
├── dbapi/
│ ├── connect()
│ ├── Connection
│ ├── Cursor
│ └── (exceptions)
│ ├── Warning
│ ├── Error
│ ├── InterfaceError
│ ├── DatabaseError
│ ├── DataError
│ ├── OperationalError
│ ├── IntegrityError
│ ├── InternalError
│ ├── ProgrammingError
│ └── NotSupportedError
├── dbapi_async/
│ ├── connect()
│ ├── Connection
│ ├── Cursor
│ └── (exceptions)
│ ├── Warning
│ ├── Error
│ ├── InterfaceError
│ ├── DatabaseError
│ ├── DataError
│ ├── OperationalError
│ ├── IntegrityError
│ ├── InternalError
│ ├── ProgrammingError
│ └── NotSupportedError
└── (aliases)/
├── SyncConn
├── SyncTransaction
├── AsyncConn
├── AsyncTransaction
└── Opts
Perf Notes
- Prefer MariaDB to MySQL
- Prefer UnixSocket to TCP
- Use BufferPool to reuse allocations between connections
- Use Conn.exec_bulk_insert_or_update to group 2~1000 INSERTTs or UPDATEEs
- The async API is fast but still far from optimal due to GIL. Wait for Python 3.14 + mature free-threaded build for faster asyncio performance
- The sync API is optimized for single-thread. The library does not actively release the GIL during operations. When free-threaded python gets mature, the optimal API will be reconsidered.
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 Distributions
Built Distributions
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 pyro_mysql-0.2.16-cp310-abi3-win_arm64.whl.
File metadata
- Download URL: pyro_mysql-0.2.16-cp310-abi3-win_arm64.whl
- Upload date:
- Size: 1.1 MB
- Tags: CPython 3.10+, Windows ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
642d92156109ff47b7a947412ed1aa34bc663ce448e34ddcf06dc7801cb22bbc
|
|
| MD5 |
b82020595e826193ba7d9b7652729172
|
|
| BLAKE2b-256 |
fd6e4531bab2f668772cfaa8d35c9590527223e987ba36eac6e932fe9df25a22
|
Provenance
The following attestation bundles were made for pyro_mysql-0.2.16-cp310-abi3-win_arm64.whl:
Publisher:
release.yml on elbaro/pyro-mysql
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pyro_mysql-0.2.16-cp310-abi3-win_arm64.whl -
Subject digest:
642d92156109ff47b7a947412ed1aa34bc663ce448e34ddcf06dc7801cb22bbc - Sigstore transparency entry: 781938626
- Sigstore integration time:
-
Permalink:
elbaro/pyro-mysql@890d9765d54593dc59c08ef0fae54543ae9b5de8 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/elbaro
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@890d9765d54593dc59c08ef0fae54543ae9b5de8 -
Trigger Event:
push
-
Statement type:
File details
Details for the file pyro_mysql-0.2.16-cp310-abi3-win_amd64.whl.
File metadata
- Download URL: pyro_mysql-0.2.16-cp310-abi3-win_amd64.whl
- Upload date:
- Size: 1.1 MB
- Tags: CPython 3.10+, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dc0341ad6a010655f567a100a16e6132187891b023d4408037695c4344a1cee6
|
|
| MD5 |
913c91cd2058e20c61e93930d789231c
|
|
| BLAKE2b-256 |
cbab6316b19b580ca270039a4fe513ce430d6653ee3181038274d4562dcb3e79
|
Provenance
The following attestation bundles were made for pyro_mysql-0.2.16-cp310-abi3-win_amd64.whl:
Publisher:
release.yml on elbaro/pyro-mysql
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pyro_mysql-0.2.16-cp310-abi3-win_amd64.whl -
Subject digest:
dc0341ad6a010655f567a100a16e6132187891b023d4408037695c4344a1cee6 - Sigstore transparency entry: 781938621
- Sigstore integration time:
-
Permalink:
elbaro/pyro-mysql@890d9765d54593dc59c08ef0fae54543ae9b5de8 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/elbaro
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@890d9765d54593dc59c08ef0fae54543ae9b5de8 -
Trigger Event:
push
-
Statement type:
File details
Details for the file pyro_mysql-0.2.16-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: pyro_mysql-0.2.16-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 3.5 MB
- Tags: CPython 3.10+, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7bd1838c44fa9e726ec87d315e53ed5c9d3b171adef213440d61b0e2ec7a7376
|
|
| MD5 |
b4b22bc1f01749596ddf2d8e0c56dbaf
|
|
| BLAKE2b-256 |
03404fb183e1b5fe7c6a24f30d27235aab825dbc00de829386789a25559b81d8
|
Provenance
The following attestation bundles were made for pyro_mysql-0.2.16-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:
Publisher:
release.yml on elbaro/pyro-mysql
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pyro_mysql-0.2.16-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
7bd1838c44fa9e726ec87d315e53ed5c9d3b171adef213440d61b0e2ec7a7376 - Sigstore transparency entry: 781938614
- Sigstore integration time:
-
Permalink:
elbaro/pyro-mysql@890d9765d54593dc59c08ef0fae54543ae9b5de8 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/elbaro
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@890d9765d54593dc59c08ef0fae54543ae9b5de8 -
Trigger Event:
push
-
Statement type:
File details
Details for the file pyro_mysql-0.2.16-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: pyro_mysql-0.2.16-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 3.2 MB
- Tags: CPython 3.10+, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c362316080c5c5f9bd72f3295f97438b2f2336c5b3250fc4b31061e1cce105c9
|
|
| MD5 |
bf91cc81979c761ea750160b75f76486
|
|
| BLAKE2b-256 |
6dc70703825ded1902dc7054b224ed5558766bff2a845a14eb128f2c9e8c3ef9
|
Provenance
The following attestation bundles were made for pyro_mysql-0.2.16-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:
Publisher:
release.yml on elbaro/pyro-mysql
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pyro_mysql-0.2.16-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl -
Subject digest:
c362316080c5c5f9bd72f3295f97438b2f2336c5b3250fc4b31061e1cce105c9 - Sigstore transparency entry: 781938611
- Sigstore integration time:
-
Permalink:
elbaro/pyro-mysql@890d9765d54593dc59c08ef0fae54543ae9b5de8 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/elbaro
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@890d9765d54593dc59c08ef0fae54543ae9b5de8 -
Trigger Event:
push
-
Statement type:
File details
Details for the file pyro_mysql-0.2.16-cp310-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: pyro_mysql-0.2.16-cp310-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 1.1 MB
- Tags: CPython 3.10+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
68f62d43b0d55555a78d7e3d59136eadb323eafc17c1d6490d602a7d9d85d139
|
|
| MD5 |
b06377247a844eaa1b34d2691326ea31
|
|
| BLAKE2b-256 |
3a5b31ac78c6c7c768a84270540c04c9654226aa9cf03961644c4d7616d21faf
|
Provenance
The following attestation bundles were made for pyro_mysql-0.2.16-cp310-abi3-macosx_11_0_arm64.whl:
Publisher:
release.yml on elbaro/pyro-mysql
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pyro_mysql-0.2.16-cp310-abi3-macosx_11_0_arm64.whl -
Subject digest:
68f62d43b0d55555a78d7e3d59136eadb323eafc17c1d6490d602a7d9d85d139 - Sigstore transparency entry: 781938618
- Sigstore integration time:
-
Permalink:
elbaro/pyro-mysql@890d9765d54593dc59c08ef0fae54543ae9b5de8 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/elbaro
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@890d9765d54593dc59c08ef0fae54543ae9b5de8 -
Trigger Event:
push
-
Statement type:
File details
Details for the file pyro_mysql-0.2.16-cp310-abi3-macosx_10_12_x86_64.whl.
File metadata
- Download URL: pyro_mysql-0.2.16-cp310-abi3-macosx_10_12_x86_64.whl
- Upload date:
- Size: 1.2 MB
- Tags: CPython 3.10+, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
493b35826678a5ec55bc88e8c8a3a9dbfdf381dce2a41b0856bb98234efc129d
|
|
| MD5 |
d3580c75af79b5147dd268f061422566
|
|
| BLAKE2b-256 |
2769d96fc97c3b9791979f0951511c7273836130f868d9630fd7a072511e7631
|
Provenance
The following attestation bundles were made for pyro_mysql-0.2.16-cp310-abi3-macosx_10_12_x86_64.whl:
Publisher:
release.yml on elbaro/pyro-mysql
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pyro_mysql-0.2.16-cp310-abi3-macosx_10_12_x86_64.whl -
Subject digest:
493b35826678a5ec55bc88e8c8a3a9dbfdf381dce2a41b0856bb98234efc129d - Sigstore transparency entry: 781938623
- Sigstore integration time:
-
Permalink:
elbaro/pyro-mysql@890d9765d54593dc59c08ef0fae54543ae9b5de8 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/elbaro
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@890d9765d54593dc59c08ef0fae54543ae9b5de8 -
Trigger Event:
push
-
Statement type: