From 23e088bccff02f18e4a27ef9dfc656c814695525 Mon Sep 17 00:00:00 2001 From: Federico Caselli Date: Sat, 6 Feb 2021 12:11:54 +0100 Subject: [PATCH] Detect non async driver on engine creation An error is raised when creating an async engine with an incompatible dbapi. Before the error was raised only when first using the engine. Change-Id: I977952b4c03ae51f568749ad744c545197bcd887 Reference: #5920 --- lib/sqlalchemy/exc.py | 2 +- lib/sqlalchemy/ext/asyncio/engine.py | 5 +++++ test/ext/asyncio/test_engine_py3k.py | 12 +++++++++++- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/lib/sqlalchemy/exc.py b/lib/sqlalchemy/exc.py index 289b8dfab1..a0a86826d1 100644 --- a/lib/sqlalchemy/exc.py +++ b/lib/sqlalchemy/exc.py @@ -287,7 +287,7 @@ class NoReferenceError(InvalidRequestError): class AwaitRequired(InvalidRequestError): """Error raised by the async greenlet spawn if no async operation - was awaited when it required one + was awaited when it required one. """ diff --git a/lib/sqlalchemy/ext/asyncio/engine.py b/lib/sqlalchemy/ext/asyncio/engine.py index aa7e60dfb5..db95ab3712 100644 --- a/lib/sqlalchemy/ext/asyncio/engine.py +++ b/lib/sqlalchemy/ext/asyncio/engine.py @@ -527,6 +527,11 @@ class AsyncEngine(ProxyComparable, AsyncConnectable): await self.conn.close() def __init__(self, sync_engine: Engine): + if not sync_engine.dialect.is_async: + raise exc.InvalidRequestError( + "The asyncio extension requires an async driver to be used. " + f"The loaded {sync_engine.dialect.driver!r} is not async." + ) self.sync_engine = self._proxied = sync_engine def begin(self): diff --git a/test/ext/asyncio/test_engine_py3k.py b/test/ext/asyncio/test_engine_py3k.py index 72d8668821..512f0447f8 100644 --- a/test/ext/asyncio/test_engine_py3k.py +++ b/test/ext/asyncio/test_engine_py3k.py @@ -1,6 +1,7 @@ import asyncio from sqlalchemy import Column +from sqlalchemy import create_engine from sqlalchemy import delete from sqlalchemy import event from sqlalchemy import exc @@ -662,9 +663,18 @@ class AsyncResultTest(EngineFixture): class TextSyncDBAPI(fixtures.TestBase): + def test_sync_dbapi_raises(self): + with expect_raises_message( + exc.InvalidRequestError, + "The asyncio extension requires an async driver to be used.", + ): + create_async_engine("sqlite:///:memory:") + @testing.fixture def async_engine(self): - return create_async_engine("sqlite:///:memory:") + engine = create_engine("sqlite:///:memory:", future=True) + engine.dialect.is_async = True + return _async_engine.AsyncEngine(engine) @async_test @combinations( -- 2.47.2