Fixed :meth:`.MetaData.reflect` to correctly use

the given :class:`.Connection`, if given, without
opening a second connection from that connection's
:class:`.Engine`. [ticket:2604]
This commit is contained in:
Mike Bayer 2012-11-14 00:51:38 -05:00
parent 7a03aded91
commit bef89a2440
3 changed files with 46 additions and 6 deletions

View 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

View 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):

View 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()