]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- added "views=True" option to metadata.reflect(),
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 2 Oct 2010 22:05:19 +0000 (18:05 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 2 Oct 2010 22:05:19 +0000 (18:05 -0400)
will add the list of available views to those
being reflected.  [ticket:1936]

CHANGES
lib/sqlalchemy/schema.py
test/engine/test_reflection.py

diff --git a/CHANGES b/CHANGES
index ab5e240bfc2551799e8bf119c7aa01990a9e0d4a..0416bca24c1d88ef2067fae4a80d7d2f62d8bb17 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -171,7 +171,11 @@ CHANGES
    - the logging message emitted by the engine when
      a connection is first used is now "BEGIN (implicit)" 
      to emphasize that DBAPI has no explicit begin().
-
+   
+   - added "views=True" option to metadata.reflect(), 
+     will add the list of available views to those
+     being reflected.  [ticket:1936]
+     
 - informix
    - *Major* cleanup / modernization of the Informix 
      dialect for 0.6, courtesy Florian Apolloner. 
index 59f9fae7f15be0f4f582c79b13705e2211c139a4..069e58ceddc65eaaf87f52099668cfdb43b1dcce 100644 (file)
@@ -2010,7 +2010,7 @@ class MetaData(SchemaItem):
         from sqlalchemy.sql.util import sort_tables
         return sort_tables(self.tables.itervalues())
         
-    def reflect(self, bind=None, schema=None, only=None):
+    def reflect(self, bind=None, schema=None, views=False, only=None):
         """Load all available table definitions from the database.
 
         Automatically creates ``Table`` entries in this ``MetaData`` for any
@@ -2026,7 +2026,10 @@ class MetaData(SchemaItem):
 
         :param schema:
           Optional, query and reflect tables from an alterate schema.
-
+        
+        :param views:
+          If True, also reflect views.
+          
         :param only:
           Optional.  Load only a sub-set of available named tables.  May be
           specified as a sequence of names or a callable.
@@ -2055,6 +2058,11 @@ class MetaData(SchemaItem):
 
         available = util.OrderedSet(bind.engine.table_names(schema,
                                                             connection=conn))
+        if views:
+            available.update(
+                bind.dialect.get_view_names(conn or bind, schema)
+            )
+            
         current = set(self.tables.iterkeys())
 
         if only is None:
index 6a8e7cf8acef404adf1f3a9793d9e7e26c2fa360..d0d6e31e13856249097a7121c4e839e8646b4a7d 100644 (file)
@@ -760,28 +760,50 @@ class ReflectionTest(TestBase, ComparesTables):
         finally:
             m1.drop_all()
 
+    @testing.provide_metadata
     def test_views(self):
-        meta = MetaData(testing.db)
-        users, addresses = createTables(meta, None)
-        meta.create_all()
-        createViews(meta.bind, None)
+        users, addresses = createTables(metadata, None)
         try:
+            metadata.create_all()
+            createViews(metadata.bind, None)
             m2 = MetaData(testing.db)
             users_v = Table("users_v", m2, autoload=True)
             addresses_v = Table("email_addresses_v", m2, autoload=True)
-            
+        
             for c1, c2 in zip(users.c, users_v.c):
                 eq_(c1.name, c2.name)
                 self.assert_types_base(c1, c2)
-                
+            
             for c1, c2 in zip(addresses.c, addresses_v.c):
                 eq_(c1.name, c2.name)
                 self.assert_types_base(c1, c2)
+        finally:
+            dropViews(metadata.bind)    
+    
+    @testing.provide_metadata
+    def test_reflect_all_with_views(self):
+        users, addresses = createTables(metadata, None)
+        try:
+            metadata.create_all()
+            createViews(metadata.bind, None)
+            m2 = MetaData(testing.db)
+            
+            m2.reflect(views=False)
+            eq_(
+                set(m2.tables), 
+                set([u'users', u'email_addresses'])
+            )
             
+            m2 = MetaData(testing.db)
+            m2.reflect(views=True)
+            eq_(
+                set(m2.tables), 
+                set([u'email_addresses_v', u'users_v', 
+                            u'users', u'email_addresses'])
+            )
         finally:
-            dropViews(meta.bind, None)
-            meta.drop_all()
-        
+            dropViews(metadata.bind)
+            
 class CreateDropTest(TestBase):
 
     @classmethod