From: Lukáš Kožušník Date: Fri, 26 Sep 2025 22:37:50 +0000 (-0400) Subject: fix: pass dialect-specific kwargs to MetaData.reflect X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8a77dc640bb35902e4bf9ba47364f182e9ee6c71;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git fix: pass dialect-specific kwargs to MetaData.reflect 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 --- 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(