Description
aiomysql ======== .. image:: https://github.com/aio-libs/aiomysql/actions/workflows/ci-cd.yml/badge.svg?branch=main :target: https://github.com/aio-libs/aiomysql/actions/workflows/ci-cd.yml .. image:: https://codecov.io/gh/aio-libs/aiomysql/branch/main/graph/badge.svg :target: https://codecov.io/gh/aio-libs/aiomysql :alt: Code coverage .. image:: https://badge.fury.io/py/aiomysql.svg :target: https://badge.fury.io/py/aiomysql :alt: Latest Version .. image:: https://readthedocs.org/projects/aiomysql/badge/?version=latest :target: https://aiomysql.readthedocs.io/ :alt: Documentation Status .. image:: https://badges.gitter.im/Join%20Chat.svg :target: https://gitter.im/aio-libs/Lobby :alt: Chat on Gitter **aiomysql** is a "driver" for accessing a `MySQL` database from the asyncio_ (PEP-3156/tulip) framework. It depends on and reuses most parts of PyMySQL_ . *aiomysql* tries to be like awesome aiopg_ library and preserve same api, look and feel. Internally **aiomysql** is copy of PyMySQL, underlying io calls switched to async, basically ``yield from`` and ``asyncio.coroutine`` added in proper places)). `sqlalchemy` support ported from aiopg_. Documentation ------------- https://aiomysql.readthedocs.io/ Basic Example ------------- **aiomysql** based on PyMySQL_ , and provides same api, you just need to use ``await conn.f()`` or ``yield from conn.f()`` instead of calling ``conn.f()`` for every method. Properties are unchanged, so ``conn.prop`` is correct as well as ``conn.prop = val``. .. code:: python import asyncio import aiomysql async def test_example(): async with aiomysql.create_pool(host='127.0.0.1', port=3306, user='root', password='', db='mysql') as pool: async with pool.acquire() as conn: async with conn.cursor() as cur: await cur.execute("SELECT 42;") print(cur.description) (r,) = await cur.fetchone() assert r == 42 asyncio.run(test_example()) Example of SQLAlchemy optional integration ------------------------------------------ Sqlalchemy support has been ported from aiopg_ so api should be very familiar for aiopg_ user.: .. code:: python import asyncio import sqlalchemy as sa from aiomysql.sa import create_engine metadata = sa.MetaData() tbl = sa.Table('tbl', metadata, sa.Column('id', sa.Integer, primary_key=True), sa.Column('val', sa.String(255))) async def go(): engine = await create_engine(user='root', db='test_pymysql', host='127.0.0.1', password='') async with engine.acquire() as conn: await conn.execute(tbl.insert().values(val='abc')) await conn.execute(tbl.insert().values(val='xyz')) async for row in conn.execute(tbl.select()): print(row.id, row.val) engine.close() await engine.wait_closed() asyncio.run(go()) Requirements ------------ * Python_ 3.9+ * PyMySQL_ .. _Python: https://www.python.org .. _asyncio: http://docs.python.org/3.5/library/asyncio.html .. _aiopg: https://github.com/aio-libs/aiopg .. _PyMySQL: https://github.com/PyMySQL/PyMySQL .. _Tornado-MySQL: https://github.com/PyMySQL/Tornado-MySQL
Release History
| Version | Changes | Urgency | Date |
|---|---|---|---|
| 0.3.2 | Imported from PyPI (0.3.2) | Low | 4/21/2026 |
| v0.3.2 | Changes ------- 0.3.2 (2025-10-21) ^^^^^^^^^^^^^^^^^^ * Fix not persisting GitHub credentials during Git checkout action in CI for publishing release tags #1047 0.3.1 (2025-10-21) ^^^^^^^^^^^^^^^^^^ * Fix permissions in GitHub Actions workflow to allow pushing git tag after release #1046 0.3.0 (2025-10-21) ^^^^^^^^^^^^^^^^^^ * Drop support for Python 3.7 and 3.8, replaced by 3.12 and 3.13 #1026 * Bump minimum Sphinx version to generate documentation to 6.2.0 for Python 3.13 support #1026 | Low | 10/22/2025 |
| v0.2.0 | Changes ------- 0.2.0 (2023-06-11) ^^^^^^^^^^^^^^^^^^ * Bump minimal SQLAlchemy version to 1.3 #815 * Remove deprecated Pool.get #706 * | Partially ported `PyMySQL#304 <https://github.com/PyMySQL/PyMySQL/pull/304>`_ #792 | aiomysql now reraises the original exception during connect() if it's not `IOError`, `OSError` or `asyncio.TimeoutError`. | This was previously always raised as `OperationalError`. * Fix debug log level with sha256_password authentication #863 * Modernized code with | Low | 6/11/2023 |
| v0.1.1 | Changes ------- 0.1.1 (2022-05-08) ^^^^^^^^^^^^^^^^^^ * Fix SSL connection handshake charset not respecting client configuration #776 0.1.0 (2022-04-11) ^^^^^^^^^^^^^^^^^^ * Don't send sys.argv[0] as program_name to MySQL server by default #620 * Allow running process as anonymous uid #587 * Fix timed out MySQL 8.0 connections raising InternalError rather than OperationalError #660 * Fix timed out MySQL 8.0 connections being returned from Pool #660 * Ensure connections are properly close | Low | 5/8/2022 |
| v0.1.0 | Changes ------- 0.1.0 (2022-04-11) ^^^^^^^^^^^^^^^^^^ * Don't send sys.argv[0] as program_name to MySQL server by default #620 * Allow running process as anonymous uid #587 * Fix timed out MySQL 8.0 connections raising InternalError rather than OperationalError #660 * Fix timed out MySQL 8.0 connections being returned from Pool #660 * Ensure connections are properly closed before raising an OperationalError when the server connection is lost #660 * Ensure connections are properly closed b | Low | 4/11/2022 |
| v0.1.0rc2 | Changes ------- To be included in 0.1.0 (unreleased) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Don't send sys.argv[0] as program_name to MySQL server by default #620 * Allow running process as anonymous uid #587 * Fix timed out MySQL 8.0 connections raising InternalError rather than OperationalError #660 * Fix timed out MySQL 8.0 connections being returned from Pool #660 * Ensure connections are properly closed before raising an OperationalError when the server connection is lost #660 | Low | 4/11/2022 |
| v0.0.21 | # Changes * Allow to use custom Cursor subclasses #374 * Fill Connection class with actual client version #388 * Fix legacy __aiter__ methods #403 * Fix & update docs #418 #437 * Ignore pyenv's .python-version file #424 * Replace asyncio.streams.IncompleteReadError with asyncio.IncompleteReadError #460 #454 * Add support for SQLAlchemy default parameters #455 #466 * Update dependencies #485 * Support Python 3.7 & 3.8 #493 | Low | 11/26/2020 |
| v0.0.20 | # Changes * Fixed connect_timeout #360 * Fixed support for SQLA executemany #324 * Fix the python 3.7 compatibility #357 * Fixed reuse connections when StreamReader has an exception #339 * Fixes warning when inserting binary strings #326 | Low | 12/19/2018 |
| v0.0.19 | # Changes See v0.0.18 | Low | 7/11/2018 |
| v0.0.18 | ## CHANGES * Updated to support latest PyMySQL changes. * aiomysql now sends client connection info. * MySQL8+ Support including sha256_password and cached_sha2_password authentication plugins. * Default max packet length sent to the server is no longer 1. * Fixes issue where cursor.nextset can hang on query sets that raise errors. | Low | 7/9/2018 |
| v0.0.17 | ## CHANGES * Pinned version of PyMySQL | Low | 7/6/2018 |
| v0.0.16 | ## CHANGES * Added ability to execute precompiled sqlalchemy queries #294 (Thanks @vlanse) | Low | 6/3/2018 |
| v0.0.15 | ## CHANGES * Fixed handling of user-defined types for sqlalchemy #290 * Fix KeyError when server reports unknown collation #289 | Low | 5/20/2018 |
| v0.0.14 | ## CHANGES * Fixed SSL connection finalization #282 | Low | 4/22/2018 |
| v0.0.13 | ## CHANGES * Added SSL support #280 (Thanks @terrycain) * Fixed __all__ in aiomysql/__init__ #270 (Thanks @matianjun1) * Added docker fixtures #275 (Thanks @terrycain) | Low | 4/19/2018 |
| v0.0.12 | ## CHANGES * Fixed support for SQLAlchemy 1.2.0 #244 * Fixed argument for cursor.execute in sa engine #239 (Thanks @NotSoSuper) | Low | 1/18/2018 |
| v0.0.9 | ## CHANGES - Fixed AttributeError in _request_authentication function #104 (Thanks @ttlttl) - Fixed legacy auth #105 - uvloop added to test suite #106 - Fixed bug with unicode in json field #107 (Thanks @methane) | Low | 9/14/2016 |
| v0.0.8 | ## CHANGES - Default min pool size reduced to 1 #80 (Thanks @Drizzt1991) - Update to PyMySQL 0.7.5 #89 - Fixed connection cancellation in process of executing a query #79 (Thanks @Drizzt1991) | Low | 8/24/2016 |
| v0.0.7 | ## CHANGES - Fix for multiple results issue, ported from pymysql #52 - Fixed useless warning with no_delay option #55 - Added async/await support for Engine, SAConnection, Transaction #57 - pool.release returns future so we can wait on it in `__aexit__` #60 - Update to PyMySQL 0.6.7 | Low | 1/27/2016 |
| v0.0.6 | ## CHANGES - Fixed bug with SA rollback (Thanks @khlyestovillarion!) - Fixed issue with default no_delay option (Thanks @khlyestovillarion!) | Low | 12/10/2015 |
| v0.0.5 | ## CHANGES - no_delay option is deprecated and True by default - Add Cursor.mogrify() method - Support for "LOAD LOCAL INFILE" query. - Check connection inside pool, in case of timeout drop it, fixes #25 - Add support of python 3.5 features to pool, connection and cursor | Low | 10/27/2015 |
| v0.0.4 | ## CHANGES - Allow to call connection.wait_closed twice. - Fixed sqlalchemy 1.0.0 support. - Fix #11: Rename Connection.wait_closed() to .ensure_closed() - Raise ResourceWarning on non-closed Connection - Rename Connection.connect to _connect | Low | 5/23/2015 |
| v0.0.3 | ## Changes - Added support for PyMySQL up to 0.6.6. - Ported improvements from PyMySQL. - Added basic documentation. - Fixed and added more examples. | Low | 3/10/2015 |
| v0.0.2 | ## Changes - Added manifest.in | Low | 2/17/2015 |
| v0.0.1 | ## Changes - Initial release. - Implemented plain connections: connect, Connection, Cursor. - Implemented database pools. - Ported sqlalchemy optional support. | Low | 2/17/2015 |
