]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Detect non async driver on engine creation
authorFederico Caselli <cfederico87@gmail.com>
Sat, 6 Feb 2021 11:11:54 +0000 (12:11 +0100)
committerFederico Caselli <cfederico87@gmail.com>
Sat, 6 Feb 2021 11:11:54 +0000 (12:11 +0100)
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
lib/sqlalchemy/ext/asyncio/engine.py
test/ext/asyncio/test_engine_py3k.py

index 289b8dfab1c4313b6a6a63c1f64f40b722961bd7..a0a86826d17d182c33f1ca6b7989612dcebd4ba0 100644 (file)
@@ -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.
 
     """
 
index aa7e60dfb5526d7814f084bb959330e20723c7dd..db95ab371260f9c94d8d14e045be31a6da97ce8d 100644 (file)
@@ -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):
index 72d86688219df1d75fb423f7b6288c956a9b7f0b..512f0447f8081baed5f4cb1d0c9169659a90c3f4 100644 (file)
@@ -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(