]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Fixed :meth:`.MetaData.reflect` to correctly use
authorMike Bayer <mike_mp@zzzcomputing.com>
Wed, 14 Nov 2012 05:51:38 +0000 (00:51 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Wed, 14 Nov 2012 05:51:38 +0000 (00:51 -0500)
the given :class:`.Connection`, if given, without
opening a second connection from that connection's
:class:`.Engine`. [ticket:2604]

doc/build/changelog/changelog_07.rst
lib/sqlalchemy/schema.py
test/engine/test_reflection.py

index 0bcdbca832591a740e2b403c60d90c1b3d7690fe..4623d08efb1fd4bb0729fd034e250712b68575ad 100644 (file)
@@ -8,6 +8,15 @@
     :version: 0.7.10
     :released:
 
+    .. change::
+        :tags: engine, bug
+        :tickets: 2604
+
+      Fixed :meth:`.MetaData.reflect` to correctly use
+      the given :class:`.Connection`, if given, without
+      opening a second connection from that connection's
+      :class:`.Engine`.
+
     .. change::
         :tags: mssql, bug
         :tickets:2607
index b8c74c53cc8901296d4d5544d3f4f670fc2579b6..8545a0f9b18bff018b850e1260d9956744f8333a 100644 (file)
@@ -2485,13 +2485,20 @@ class MetaData(SchemaItem):
           arguments and should return a true value for any table to reflect.
 
         """
-        reflect_opts = {'autoload': True}
         if bind is None:
             bind = _bind_or_error(self)
-            conn = None
+
+        if bind.engine is not bind:
+            conn = bind
+            close = False
         else:
-            reflect_opts['autoload_with'] = bind
             conn = bind.contextual_connect()
+            close = True
+
+        reflect_opts = {
+            'autoload': True,
+            'autoload_with': bind
+        }
 
         if schema is None:
             schema = self.schema
@@ -2504,7 +2511,7 @@ class MetaData(SchemaItem):
                                                             connection=conn))
             if views:
                 available.update(
-                    bind.dialect.get_view_names(conn or bind, schema)
+                    bind.dialect.get_view_names(conn, schema)
                 )
 
             current = set(self.tables.iterkeys())
@@ -2527,8 +2534,7 @@ class MetaData(SchemaItem):
             for name in load:
                 Table(name, self, **reflect_opts)
         finally:
-            if conn is not None and \
-                conn is not bind:
+            if close:
                 conn.close()
 
     def append_ddl_listener(self, event_name, listener):
index f2fe9e3497a92e64fbfe88780c8cbd11f1607401..e034402c255f4757caa4c3876abbe07788b6bdb1 100644 (file)
@@ -700,6 +700,31 @@ class ReflectionTest(fixtures.TestBase, ComparesTables):
         table_b2 = Table('false', meta2, autoload=True)
         table_c2 = Table('is', meta2, autoload=True)
 
+    @testing.provide_metadata
+    def _test_reflect_uses_bind(self, fn):
+        from sqlalchemy.pool import AssertionPool
+        e = engines.testing_engine(options={"poolclass": AssertionPool})
+        fn(e)
+
+    def test_reflect_uses_bind_constructor_conn(self):
+        self._test_reflect_uses_bind(lambda e: MetaData(e.connect(),
+                    reflect=True))
+
+    def test_reflect_uses_bind_constructor_engine(self):
+        self._test_reflect_uses_bind(lambda e: MetaData(e, reflect=True))
+
+    def test_reflect_uses_bind_constructor_conn_reflect(self):
+        self._test_reflect_uses_bind(lambda e: MetaData(e.connect()).reflect())
+
+    def test_reflect_uses_bind_constructor_engine_reflect(self):
+        self._test_reflect_uses_bind(lambda e: MetaData(e).reflect())
+
+    def test_reflect_uses_bind_conn_reflect(self):
+        self._test_reflect_uses_bind(lambda e: MetaData().reflect(e.connect()))
+
+    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()