]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
fix: pass dialect-specific kwargs to MetaData.reflect
authorLukáš Kožušník <lukinkozusnik@seznam.cz>
Fri, 26 Sep 2025 22:37:50 +0000 (18:37 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 30 Sep 2025 17:27:20 +0000 (13:27 -0400)
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 [new file with mode: 0644]
lib/sqlalchemy/sql/schema.py
test/engine/test_reflection.py

diff --git a/doc/build/changelog/unreleased_20/12884.rst b/doc/build/changelog/unreleased_20/12884.rst
new file mode 100644 (file)
index 0000000..71dc556
--- /dev/null
@@ -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.
index 4e640e2af40cd6ef20a4711cb74b378e435d2a70..b63d597b74e5f2fdb82d7244c1e928649b514135 100644 (file)
@@ -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
 
index 6ba130add341816742f1f69a3845d8bdf123dac9..e5e8ddde4fa0a904654b77312d69a9bbf0da169e 100644 (file)
@@ -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(