diff options
author | Nils Philippsen <nils@tiptoe.de> | 2021-11-13 11:11:32 -0500 |
---|---|---|
committer | Federico Caselli <cfederico87@gmail.com> | 2021-12-10 17:20:31 +0100 |
commit | 98b1650efce79ae6d304eb08047890ef8ae89df1 (patch) | |
tree | 290ad5959858679b1b810a047fc54b4eafc070d4 | |
parent | 9d837b02b5eb42385281b88d09fe2aeea0376ca9 (diff) | |
download | sqlalchemy-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.rst | 7 | ||||
-rw-r--r-- | doc/build/orm/extensions/asyncio.rst | 2 | ||||
-rw-r--r-- | lib/sqlalchemy/ext/asyncio/__init__.py | 1 | ||||
-rw-r--r-- | lib/sqlalchemy/ext/asyncio/engine.py | 23 | ||||
-rw-r--r-- | test/ext/asyncio/test_engine_py3k.py | 11 |
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. |