]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Add reflection_options to automapbase.prepare()
authorGord Thompson <gord@gordthompson.com>
Tue, 16 Feb 2021 19:35:32 +0000 (12:35 -0700)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 25 Feb 2021 21:01:59 +0000 (16:01 -0500)
Fixes: #5942
Change-Id: If72ccca93fbe303799b1bacb7339c4c85e4251aa

doc/build/changelog/unreleased_14/5942.rst [new file with mode: 0644]
lib/sqlalchemy/ext/automap.py
test/ext/test_automap.py

diff --git a/doc/build/changelog/unreleased_14/5942.rst b/doc/build/changelog/unreleased_14/5942.rst
new file mode 100644 (file)
index 0000000..69a9cac
--- /dev/null
@@ -0,0 +1,8 @@
+.. change::
+    :tags: ext, usecase
+    :tickets: 5942
+
+    Add new parameter
+    :paramref:`_automap.AutomapBase.prepare.reflection_options`
+    to allow passing of :meth:`_schema.MetaData.reflect` options like ``only``
+    or dialect-specific reflection options like ``oracle_resolve_synonyms``.
index 6d90214bf2972d8ee6016f16c7b5394237cc8657..3d2e3eb29389a0ce03758cb2a21f7f542013cad0 100644 (file)
@@ -779,6 +779,7 @@ class AutomapBase(object):
         name_for_scalar_relationship=None,
         name_for_collection_relationship=None,
         generate_relationship=None,
+        reflection_options=util.EMPTY_DICT,
     ):
         """Extract mapped classes and relationships from the
         :class:`_schema.MetaData` and
@@ -830,6 +831,13 @@ class AutomapBase(object):
 
          .. versionadded:: 1.1
 
+        :param reflection_options: When present, this dictionary of options
+         will be passed to :meth:`_schema.MetaData.reflect`
+         to supply general reflection-specific options like ``only`` and/or
+         dialect-specific options like ``oracle_resolve_synonyms``.
+
+         .. versionadded:: 1.4
+
         """
         glbls = globals()
         if classname_for_table is None:
@@ -854,12 +862,14 @@ class AutomapBase(object):
             autoload_with = engine
 
         if reflect:
-            cls.metadata.reflect(
-                autoload_with,
+            opts = dict(
                 schema=schema,
                 extend_existing=True,
                 autoload_replace=False,
             )
+            if reflection_options:
+                opts.update(reflection_options)
+            cls.metadata.reflect(autoload_with, **opts)
 
         with _CONFIGURE_MUTEX:
             table_to_map_config = dict(
index bddb42b03d858c19a39d218ceabe1ee310398985..392941900db655d8b94f410d78bb665bd19d9e96 100644 (file)
@@ -57,6 +57,16 @@ class AutomapTest(fixtures.MappedTest):
         u1 = User(name="u1", addresses_collection=set([a1]))
         assert a1.user is u1
 
+    def test_prepare_w_only(self):
+        Base = automap_base()
+
+        Base.prepare(
+            testing.db,
+            reflection_options={"only": ["users"], "resolve_fks": False},
+        )
+        assert hasattr(Base.classes, "users")
+        assert not hasattr(Base.classes, "addresses")
+
     def test_exception_prepare_not_called(self):
         Base = automap_base(metadata=self.tables_test_metadata)
 
@@ -139,6 +149,22 @@ class AutomapTest(fixtures.MappedTest):
                 autoload_replace=False,
             )
 
+    def test_prepare_w_dialect_kwargs(self):
+        Base = automap_base(metadata=self.tables_test_metadata)
+        engine_mock = Mock()
+        with patch.object(Base.metadata, "reflect") as reflect_mock:
+            Base.prepare(
+                autoload_with=engine_mock,
+                reflection_options={"oracle_resolve_synonyms": True},
+            )
+            reflect_mock.assert_called_once_with(
+                engine_mock,
+                schema=None,
+                extend_existing=True,
+                autoload_replace=False,
+                oracle_resolve_synonyms=True,
+            )
+
     def test_naming_schemes(self):
         Base = automap_base(metadata=self.tables_test_metadata)