From 70ca284f92a218ce14969153f29c87d5e4cb277d Mon Sep 17 00:00:00 2001 From: Fantix King Date: Sun, 30 Aug 2020 10:59:15 -0500 Subject: [PATCH 1/2] allow SELECT n as rowcount --- lib/sqlalchemy/dialects/postgresql/asyncpg.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/sqlalchemy/dialects/postgresql/asyncpg.py b/lib/sqlalchemy/dialects/postgresql/asyncpg.py index 4580421f68b..d824d524bc2 100644 --- a/lib/sqlalchemy/dialects/postgresql/asyncpg.py +++ b/lib/sqlalchemy/dialects/postgresql/asyncpg.py @@ -413,7 +413,7 @@ async def _prepare_and_execute(self, operation, parameters): status = prepared_stmt.get_statusmsg() reg = re.match( - r"(?:UPDATE|DELETE|INSERT \d+) (\d+)", status + r"(?:UPDATE|DELETE|SELECT|INSERT \d+) (\d+)", status ) if reg: self.rowcount = int(reg.group(1)) From ae620b1a7a4a2cc10e0c8cf9ffa96c59d58315b4 Mon Sep 17 00:00:00 2001 From: Fantix King Date: Fri, 4 Sep 2020 20:51:38 -0500 Subject: [PATCH 2/2] async event listener --- lib/sqlalchemy/event/api.py | 11 +++++++++++ lib/sqlalchemy/util/concurrency.py | 4 ++++ 2 files changed, 15 insertions(+) diff --git a/lib/sqlalchemy/event/api.py b/lib/sqlalchemy/event/api.py index f1a2bb774cf..ff3a0a39b0e 100644 --- a/lib/sqlalchemy/event/api.py +++ b/lib/sqlalchemy/event/api.py @@ -96,6 +96,17 @@ def on_config(): """ + if util.concurrency.iscoroutinefunction(fn): + await_ = ( + util.concurrency.await_fallback + if kw.pop("async_fallback", False) + else util.concurrency.await_only + ) + listener = fn + + def fn(*_args, **kwargs): + return await_(listener(*_args, **kwargs)) + _event_key(target, identifier, fn).listen(*args, **kw) diff --git a/lib/sqlalchemy/util/concurrency.py b/lib/sqlalchemy/util/concurrency.py index c44efba6202..d985a7f691a 100644 --- a/lib/sqlalchemy/util/concurrency.py +++ b/lib/sqlalchemy/util/concurrency.py @@ -9,6 +9,7 @@ pass else: have_greenlet = True + from inspect import iscoroutinefunction from ._concurrency_py3k import await_only from ._concurrency_py3k import await_fallback from ._concurrency_py3k import greenlet_spawn @@ -48,3 +49,6 @@ def _util_async_run(fn, *arg, **kw): # noqa F81 def _util_async_run_coroutine_function(fn, *arg, **kw): # noqa F81 _not_implemented() + + def iscoroutinefunction(fn): + return False