From: Gord Thompson Date: Tue, 16 Feb 2021 19:35:32 +0000 (-0700) Subject: Add reflection_options to automapbase.prepare() X-Git-Tag: rel_1_4_0~33^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=54e848dfed020e0600fb0d50a80a4d94ad745747;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Add reflection_options to automapbase.prepare() Fixes: #5942 Change-Id: If72ccca93fbe303799b1bacb7339c4c85e4251aa --- diff --git a/doc/build/changelog/unreleased_14/5942.rst b/doc/build/changelog/unreleased_14/5942.rst new file mode 100644 index 0000000000..69a9cacc32 --- /dev/null +++ b/doc/build/changelog/unreleased_14/5942.rst @@ -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``. diff --git a/lib/sqlalchemy/ext/automap.py b/lib/sqlalchemy/ext/automap.py index 6d90214bf2..3d2e3eb293 100644 --- a/lib/sqlalchemy/ext/automap.py +++ b/lib/sqlalchemy/ext/automap.py @@ -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( diff --git a/test/ext/test_automap.py b/test/ext/test_automap.py index bddb42b03d..392941900d 100644 --- a/test/ext/test_automap.py +++ b/test/ext/test_automap.py @@ -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)