From: Nils Philippsen Date: Mon, 8 Nov 2021 22:45:26 +0000 (+0100) Subject: Add async_engine_from_config() X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c7c758833b6c37b7509b8c5bed4f26ac0ccc0395;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Add async_engine_from_config() This is largely lifted from engine_from_config(). Fixes: #7301 Signed-off-by: Nils Philippsen --- diff --git a/lib/sqlalchemy/ext/asyncio/__init__.py b/lib/sqlalchemy/ext/asyncio/__init__.py index ac3b905c61..0310397137 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 221d82f088..e47045cba9 100644 --- a/lib/sqlalchemy/ext/asyncio/engine.py +++ b/lib/sqlalchemy/ext/asyncio/engine.py @@ -41,6 +41,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 works analogous to :func:`_sa.engine_from_config`, but the + configured dialect must be an asyncio-compatible dialect such as + :ref:`dialect-postgresql-asyncpg`. Arguments + passed to :func:`_asyncio.async_engine_from_config` are mostly + identical to :func:`_sa.engine_from_config`. + + .. versionadded:: 1.4.28 + + """ + 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 44cf9388ca..25fbb31682 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 @@ -590,6 +591,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.