From 8a77dc640bb35902e4bf9ba47364f182e9ee6c71 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Luk=C3=A1=C5=A1=20Ko=C5=BEu=C5=A1n=C3=ADk?= Date: Fri, 26 Sep 2025 18:37:50 -0400 Subject: [PATCH] fix: pass dialect-specific kwargs to MetaData.reflect MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Fixed issue where :meth:`_schema.MetaData.reflect` did not forward dialect-specific keyword arguments to the :class:`_engine.Inspector` methods, causing options like ``oracle_resolve_synonyms`` to be ignored during reflection. The method now ensures that all extra kwargs passed to :meth:`_schema.MetaData.reflect` are forwarded to :meth:`_engine.Inspector.get_table_names` and related reflection methods. Pull request courtesy Lukáš Kožušník. Fixes: #12884 Closes: #12885 Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/12885 Pull-request-sha: 9436812223600a2459461744fe20648639afc07d Change-Id: Idb1ca0bc624df8e175cbfa979a8f31e62de185fe --- doc/build/changelog/unreleased_20/12884.rst | 11 +++++++++++ lib/sqlalchemy/sql/schema.py | 10 +++++++--- test/engine/test_reflection.py | 21 +++++++++++++++++++++ 3 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 doc/build/changelog/unreleased_20/12884.rst diff --git a/doc/build/changelog/unreleased_20/12884.rst b/doc/build/changelog/unreleased_20/12884.rst new file mode 100644 index 0000000000..71dc55644d --- /dev/null +++ b/doc/build/changelog/unreleased_20/12884.rst @@ -0,0 +1,11 @@ +.. change:: + :tags: bug, schema + :tickets: 12884 + + Fixed issue where :meth:`_schema.MetaData.reflect` did not forward + dialect-specific keyword arguments to the :class:`_engine.Inspector` + methods, causing options like ``oracle_resolve_synonyms`` to be ignored + during reflection. The method now ensures that all extra kwargs passed to + :meth:`_schema.MetaData.reflect` are forwarded to + :meth:`_engine.Inspector.get_table_names` and related reflection methods. + Pull request courtesy Lukáš Kožušník. diff --git a/lib/sqlalchemy/sql/schema.py b/lib/sqlalchemy/sql/schema.py index 4e640e2af4..b63d597b74 100644 --- a/lib/sqlalchemy/sql/schema.py +++ b/lib/sqlalchemy/sql/schema.py @@ -5939,13 +5939,17 @@ class MetaData(HasSchemaAttr): kind = util.preloaded.engine_reflection.ObjectKind.TABLE available: util.OrderedSet[str] = util.OrderedSet( - insp.get_table_names(schema) + insp.get_table_names(schema, **dialect_kwargs) ) if views: kind = util.preloaded.engine_reflection.ObjectKind.ANY - available.update(insp.get_view_names(schema)) + available.update(insp.get_view_names(schema, **dialect_kwargs)) try: - available.update(insp.get_materialized_view_names(schema)) + available.update( + insp.get_materialized_view_names( + schema, **dialect_kwargs + ) + ) except NotImplementedError: pass diff --git a/test/engine/test_reflection.py b/test/engine/test_reflection.py index 6ba130add3..e5e8ddde4f 100644 --- a/test/engine/test_reflection.py +++ b/test/engine/test_reflection.py @@ -249,6 +249,27 @@ class ReflectionTest(fixtures.TestBase, ComparesTables): t2 = meta2.tables["t2"] is_true(t1.c.t2id.references(t2.c.id)) + @testing.combinations( + "get_table_names", + "get_view_names", + "get_materialized_view_names", + argnames="method", + ) + def test_reflect_forwards_multiple_kwargs( + self, connection, metadata, method + ): + with mock.patch( + f"sqlalchemy.engine.reflection.Inspector.{method}", + return_value=set(), + ) as mocked_method: + metadata.reflect( + bind=connection, flag1=True, flag2=123, flag3="abc", views=True + ) + + mocked_method.assert_called_once_with( + None, flag1=True, flag2=123, flag3="abc" + ) + def test_nonexistent(self, connection): meta = MetaData() assert_raises( -- 2.47.3