]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- The :paramref:`.Table.extend_existing` and :paramref:`.Table.autoload_replace`
authorMike Bayer <mike_mp@zzzcomputing.com>
Sun, 5 Jan 2014 02:12:31 +0000 (21:12 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sun, 5 Jan 2014 02:12:31 +0000 (21:12 -0500)
parameters are now available on the :meth:`.MetaData.reflect`
method.
- starting to use paramref and need newer paramlinks version.

doc/build/changelog/changelog_09.rst
doc/build/requirements.txt
lib/sqlalchemy/sql/schema.py
test/engine/test_reflection.py

index c72d853d9a48d57cb2d1a64da4979a2a413be478..2dbb9702daefa1e738be7397378e18ae2edd4f27 100644 (file)
 .. changelog::
     :version: 0.9.1
 
+    .. change::
+        :tags: feature, core
+
+        The :paramref:`.Table.extend_existing` and :paramref:`.Table.autoload_replace`
+        parameters are now available on the :meth:`.MetaData.reflect`
+        method.
+
     .. change::
         :tags: bug, orm, declarative
 
index 52f594ca594485107bf872409def62435109cad7..a5b32f735bbff6fed1647a61c436eeee92f6c639 100644 (file)
@@ -1,3 +1,3 @@
 mako
 changelog>=0.3.2
-sphinx-paramlinks>=0.1.8
+sphinx-paramlinks>=0.1.9
index 6205ada34a1e5624d042fa72c63392d4d7ec892e..97c160bf5b15519a2eb8f60ad94767ef45b42d39 100644 (file)
@@ -2894,7 +2894,9 @@ class MetaData(SchemaItem):
         """
         return ddl.sort_tables(self.tables.values())
 
-    def reflect(self, bind=None, schema=None, views=False, only=None):
+    def reflect(self, bind=None, schema=None, views=False, only=None,
+                                extend_existing=False,
+                                autoload_replace=True):
         """Load all available table definitions from the database.
 
         Automatically creates ``Table`` entries in this ``MetaData`` for any
@@ -2929,6 +2931,17 @@ class MetaData(SchemaItem):
           with a table name and this ``MetaData`` instance as positional
           arguments and should return a true value for any table to reflect.
 
+        :param extend_existing: Passed along to each :class:`.Table` as
+          :paramref:`.Table.extend_existing`.
+
+          .. versionadded:: 0.9.1
+
+        :param autoload_replace: Passed along to each :class:`.Table` as
+          :paramref:`.Table.autoload_replace`.
+
+          .. versionadded:: 0.9.1
+
+
         """
         if bind is None:
             bind = _bind_or_error(self)
@@ -2937,7 +2950,9 @@ class MetaData(SchemaItem):
 
             reflect_opts = {
                 'autoload': True,
-                'autoload_with': conn
+                'autoload_with': conn,
+                'extend_existing': extend_existing,
+                'autoload_replace': autoload_replace
             }
 
             if schema is None:
@@ -2963,12 +2978,13 @@ class MetaData(SchemaItem):
 
             if only is None:
                 load = [name for name, schname in
-                            zip(available, available_w_schema)
-                            if schname not in current]
+                        zip(available, available_w_schema)
+                        if extend_existing or schname not in current]
             elif util.callable(only):
                 load = [name for name, schname in
                             zip(available, available_w_schema)
-                            if schname not in current and only(name, self)]
+                            if (extend_existing or schname not in current)
+                            and only(name, self)]
             else:
                 missing = [name for name in only if name not in available]
                 if missing:
@@ -2977,7 +2993,8 @@ class MetaData(SchemaItem):
                         'Could not reflect: requested table(s) not available '
                         'in %s%s: (%s)' %
                         (bind.engine.url, s, ', '.join(missing)))
-                load = [name for name in only if name not in current]
+                load = [name for name in only if extend_existing or
+                                                    name not in current]
 
             for name in load:
                 Table(name, self, **reflect_opts)
index a3b0ecdb521e14aa767616fbd336d7944f8c9acf..bd065103ee19530d781583c92203e28cd9a0cd20 100644 (file)
@@ -823,6 +823,7 @@ class ReflectionTest(fixtures.TestBase, ComparesTables):
     def test_reflect_uses_bind_engine_reflect(self):
         self._test_reflect_uses_bind(lambda e: MetaData().reflect(e))
 
+
     @testing.provide_metadata
     def test_reflect_all(self):
         existing = testing.db.table_names()
@@ -878,6 +879,18 @@ class ReflectionTest(fixtures.TestBase, ComparesTables):
             m8.reflect
         )
 
+        m8_e1 = MetaData(testing.db)
+        rt_c = Table('rt_c', m8_e1)
+        m8_e1.reflect(extend_existing=True)
+        eq_(set(m8_e1.tables.keys()), set(names))
+        eq_(rt_c.c.keys(), ['id'])
+
+        m8_e2 = MetaData(testing.db)
+        rt_c = Table('rt_c', m8_e2)
+        m8_e2.reflect(extend_existing=True, only=['rt_a', 'rt_c'])
+        eq_(set(m8_e2.tables.keys()), set(['rt_a', 'rt_c']))
+        eq_(rt_c.c.keys(), ['id'])
+
         if existing:
             print("Other tables present in database, skipping some checks.")
         else: