Package: aiomysql
aiomysqlis a “driver” for accessing aMySQLdatabase
from theasyncio(PEP-3156/tulip) framework. It depends on and reuses most
parts ofPyMySQL.aiomysqltries to be like awesomeaiopglibrary and
preserve same api, look and feel.Internallyaiomysqlis copy of PyMySQL, underlying io calls switched
to async, basicallyyield fromandasyncio.coroutineadded in
proper places)).sqlalchemysupport ported fromaiopg.Documentationhttps://aiomysql.readthedocs.io/Basic Exampleaiomysqlbased onPyMySQL, and provides same api, you just need
to useawait conn.f()oryield from conn.f()instead of callingconn.f()for every method.Properties are unchanged, soconn.propis correct as well asconn.prop = val.importasyncioimportaiomysqlasyncdeftest_example(loop):pool=awaitaiomysql.create_pool(host='127.0.0.1',port=3306,user='root',password='',db='mysql',loop=loop)asyncwithpool.acquire()asconn:asyncwithconn.cursor()ascur:awaitcur.execute("SELECT 42;")print(cur.description)(r,)=awaitcur.fetchone()assertr==42pool.close()awaitpool.wait_closed()loop=asyncio.get_event_loop()loop.run_until_complete(test_example(loop))Example of SQLAlchemy optional integrationSqlalchemy support has been ported fromaiopgso api should be very familiar
foraiopguser.:importasyncioimportsqlalchemyassafromaiomysql.saimportcreate_enginemetadata=sa.MetaData()tbl=sa.Table('tbl',metadata,sa.Column('id',sa.Integer,primary_key=True),sa.Column('val',sa.String(255)))asyncdefgo(loop):engine=awaitcreate_engine(user='root',db='test_pymysql',host='127.0.0.1',password='',loop=loop)asyncwithengine.acquire()asconn:awaitconn.execute(tbl.insert().values(val='abc'))awaitconn.execute(tbl.insert().values(val='xyz'))asyncforrowinconn.execute(tbl.select()):print(row.id,row.val)engine.close()awaitengine.wait_closed()loop=asyncio.get_event_loop()loop.run_until_complete(go(loop))RequirementsPython3.7+PyMySQLChanges0.2.0 (2023-06-11)Bump minimal SQLAlchemy version to 1.3 #815Remove deprecated Pool.get #706Partially portedPyMySQL#304#792aiomysql now reraises the original exception during connect() if it’s notIOError,OSErrororasyncio.TimeoutError.This was previously always raised asOperationalError.Fix debug log level with sha256_password authentication #863Modernized code withpyupgradeto Python 3.7+ syntax #930Removed tests for EoL MariaDB versions 10.3, 10.7 and 10.8, added tests for MariaDB 10.9, 10.10, 10.11 #9320.1.1 (2022-05-08)Fix SSL connection handshake charset not respecting client configuration #7760.1.0 (2022-04-11)Don’t send sys.argv[0] as program_name to MySQL server by default #620Allow running process as anonymous uid #587Fix timed out MySQL 8.0 connections raising InternalError rather than OperationalError #660Fix timed out MySQL 8.0 connections being returned from Pool #660Ensure connections are properly closed before raising an OperationalError when the server connection is lost #660Ensure connections are properly closed before raising an InternalError when packet sequence numbers are out of sync #660Unix sockets are now internally considered secure, allowing sha256_password and caching_sha2_password auth methods to be used #695Test suite now also tests unix socket connections #696Fix SSCursor raising InternalError when last result was not fully retrieved #635Remove deprecated no_delay argument #702Support PyMySQL up to version 1.0.2 #643Bump minimal PyMySQL version to 1.0.0 #713Align % formatting in Cursor.executemany() with Cursor.execute(), literal % now need to be doubled in Cursor.executemany() #714Fixed unlimited Pool size not working, this is now working as documented by passing maxsize=0 to create_pool #119Added Pool.closed property as present in aiopg #463Fixed SQLAlchemy connection context iterator #410Fix error packet handling for SSCursor #428Required python version is now properly documented in python_requires instead of failing on setup.py execution #731Add rsa extras_require depending on PyMySQL[rsa] #557Migrate to PEP 517 build system #746Self-reported__version__now returns version generated bysetuptools-scmduring build, otherwise‘unknown’#748Fix SSCursor raising query timeout error on wrong query #4280.0.22 (2021-11-14)Support python 3.10 #5050.0.21 (2020-11-26)Allow to use custom Cursor subclasses #374Fill Connection class with actual client version #388Fix legacy __aiter__ methods #403Fix & update docs #418 #437Ignore pyenv’s .python-version file #424Replace asyncio.streams.IncompleteReadError with asyncio.IncompleteReadError #460 #454Add support for SQLAlchemy default parameters #455 #466Update dependencies #485Support Python 3.7 & 3.8 #4930.0.20 (2018-12-19)Fixed connect_timeout #360Fixed support for SQLA executemany #324Fix the python 3.7 compatibility #357Fixed reuse connections when StreamReader has an exception #339Fixes warning when inserting binary strings #3260.0.19 (2018-07-12)See v0.0.180.0.18 (2018-07-09)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.0.0.17 (2018-07-06)Pinned version of PyMySQL0.0.16 (2018-06-03)Added ability to execute precompiled sqlalchemy queries #294 (Thanks @vlanse)0.0.15 (2018-05-20)Fixed handling of user-defined types for sqlalchemy  #290Fix KeyError when server reports unknown collation #2890.0.14 (2018-04-22)Fixed SSL connection finalization  #2820.0.13 (2018-04-19)Added SSL support #280 (Thanks @terrycain)Fixed __all__ in aiomysql/__init__ #270 (Thanks @matianjun1)Added docker fixtures #275 (Thanks @terrycain)0.0.12 (2018-01-18)Fixed support for SQLAlchemy 1.2.0Fixed argument for cursor.execute in sa engine #239 (Thanks @NotSoSuper)0.0.11 (2017-12-06)Fixed README formatting on pypi0.0.10 (2017-12-06)Updated regular expressions to be compatible with pymysql #167 (Thanks @AlexLisovoy)Added connection recycling in the pool #2160.0.9 (2016-09-14)Fixed AttributeError in  _request_authentication function #104 (Thanks @ttlttl)Fixed legacy auth #105uvloop added to test suite #106Fixed bug with unicode in json field #107 (Thanks @methane)0.0.8 (2016-08-24)Default min pool size reduced to 1 #80 (Thanks @Drizzt1991)Update to PyMySQL 0.7.5 #89Fixed connection cancellation in process of executing a query #79 (Thanks @Drizzt1991)0.0.7 (2016-01-27)Fix for multiple results issue, ported from pymysql #52Fixed useless warning with no_delay option #55Added async/await support for Engine, SAConnection, Transaction #57pool.release returns future so we can wait on it in __aexit__ #60Update to PyMySQL 0.6.70.0.6 (2015-12-11)Fixed bug with SA rollback (Thanks @khlyestovillarion!)Fixed issue with default no_delay option (Thanks @khlyestovillarion!)0.0.5 (2015-10-28)no_delay option is deprecated and True by defaultAdd Cursor.mogrify() methodSupport for “LOAD LOCAL INFILE” query.Check connection inside pool, in case of timeout drop it, fixes #25Add support of python 3.5 features to pool, connection and cursor0.0.4 (2015-05-23)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 ConnectionRename Connection.connect to _connect0.0.3 (2015-03-10)Added support for PyMySQL up to 0.6.6.Ported improvements from PyMySQL.Added basic documentation.Fixed and added more examples.0.0.2 (2015-02-17)Added MANIFEST.in.0.0.1 (2015-02-17)Initial release.Implemented plain connections: connect, Connection, Cursor.Implemented database pools.Ported sqlalchemy optional support.