summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNils Philippsen <nils@tiptoe.de>2021-11-13 11:11:32 -0500
committerFederico Caselli <cfederico87@gmail.com>2021-12-10 17:20:31 +0100
commit98b1650efce79ae6d304eb08047890ef8ae89df1 (patch)
tree290ad5959858679b1b810a047fc54b4eafc070d4
parent9d837b02b5eb42385281b88d09fe2aeea0376ca9 (diff)
downloadsqlalchemy-98b1650efce79ae6d304eb08047890ef8ae89df1.tar.gz
Add async_engine_from_config()
Added :func:`_asyncio.async_engine_config` function to create an async engine from a configuration dict. This otherwise behaves the same as :func:`_sa.engine_from_config`. Fixes: #7301 Closes: #7302 Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/7302 Pull-request-sha: c7c758833b6c37b7509b8c5bed4f26ac0ccc0395 Change-Id: I64feadf95b5015c24fe0fa0dbae6755b72d1713e
-rw-r--r--doc/build/changelog/unreleased_14/7301.rst7
-rw-r--r--doc/build/orm/extensions/asyncio.rst2
-rw-r--r--lib/sqlalchemy/ext/asyncio/__init__.py1
-rw-r--r--lib/sqlalchemy/ext/asyncio/engine.py23
-rw-r--r--test/ext/asyncio/test_engine_py3k.py11
5 files changed, 44 insertions, 0 deletions
diff --git a/doc/build/changelog/unreleased_14/7301.rst b/doc/build/changelog/unreleased_14/7301.rst
new file mode 100644
index 000000000..a8a71afac
--- /dev/null
+++ b/doc/build/changelog/unreleased_14/7301.rst
@@ -0,0 +1,7 @@
+.. change::
+ :tags: usecase, asyncio
+ :tickets: 7425
+
+ Added :func:`_asyncio.async_engine_config` function to create
+ an async engine from a configuration dict. This otherwise
+ behaves the same as :func:`_sa.engine_from_config`.
diff --git a/doc/build/orm/extensions/asyncio.rst b/doc/build/orm/extensions/asyncio.rst
index 91c7c53e1..a7d2fb16b 100644
--- a/doc/build/orm/extensions/asyncio.rst
+++ b/doc/build/orm/extensions/asyncio.rst
@@ -732,6 +732,8 @@ Engine API Documentation
.. autofunction:: create_async_engine
+.. autofunction:: async_engine_from_config
+
.. autoclass:: AsyncEngine
:members:
diff --git a/lib/sqlalchemy/ext/asyncio/__init__.py b/lib/sqlalchemy/ext/asyncio/__init__.py
index ac3b905c6..031039713 100644
--- a/lib/sqlalchemy/ext/asyncio/__init__.py
+++ b/lib/sqlalchemy/ext/asyncio/__init__.py
@@ -5,6 +5,7 @@
# This module is part of SQLAlchemy and is released under
# the MIT License: https://www.opensource.org/licenses/mit-license.php
+from .engine import async_engine_from_config
from .engine import AsyncConnection
from .engine import AsyncEngine
from .engine import AsyncTransaction
diff --git a/lib/sqlalchemy/ext/asyncio/engine.py b/lib/sqlalchemy/ext/asyncio/engine.py
index 67d944b9c..476d5515c 100644
--- a/lib/sqlalchemy/ext/asyncio/engine.py
+++ b/lib/sqlalchemy/ext/asyncio/engine.py
@@ -42,6 +42,29 @@ def create_async_engine(*arg, **kw):
return AsyncEngine(sync_engine)
+def async_engine_from_config(configuration, prefix="sqlalchemy.", **kwargs):
+ """Create a new AsyncEngine instance using a configuration dictionary.
+
+ This function is analogous to the :func:`_sa.engine_from_config` function
+ in SQLAlchemy Core, except that the requested dialect must be an
+ asyncio-compatible dialect such as :ref:`dialect-postgresql-asyncpg`.
+ The argument signature of the function is identical to that
+ of :func:`_sa.engine_from_config`.
+
+ .. versionadded:: 1.4.29
+
+ """
+ options = {
+ key[len(prefix) :]: value
+ for key, value in configuration.items()
+ if key.startswith(prefix)
+ }
+ options["_coerce_config"] = True
+ options.update(kwargs)
+ url = options.pop("url")
+ return create_async_engine(url, **options)
+
+
class AsyncConnectable:
__slots__ = "_slots_dispatch", "__weakref__"
diff --git a/test/ext/asyncio/test_engine_py3k.py b/test/ext/asyncio/test_engine_py3k.py
index c65a51bf7..7e680bd0e 100644
--- a/test/ext/asyncio/test_engine_py3k.py
+++ b/test/ext/asyncio/test_engine_py3k.py
@@ -14,6 +14,7 @@ from sqlalchemy import Table
from sqlalchemy import testing
from sqlalchemy import text
from sqlalchemy import union_all
+from sqlalchemy.ext.asyncio import async_engine_from_config
from sqlalchemy.ext.asyncio import create_async_engine
from sqlalchemy.ext.asyncio import engine as _async_engine
from sqlalchemy.ext.asyncio import exc as asyncio_exc
@@ -588,6 +589,16 @@ class AsyncEngineTest(EngineFixture):
server_side_cursors=True,
)
+ def test_async_engine_from_config(self):
+ config = {
+ "sqlalchemy.url": str(testing.db.url),
+ "sqlalchemy.echo": "true",
+ }
+ engine = async_engine_from_config(config)
+ assert engine.url == testing.db.url
+ assert engine.echo is True
+ assert engine.dialect.is_async is True
+
class AsyncEventTest(EngineFixture):
"""The engine events all run in their normal synchronous context.