]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Added table.add_is_dependent_on(othertable), allows manual
authorMike Bayer <mike_mp@zzzcomputing.com>
Thu, 13 May 2010 19:53:18 +0000 (15:53 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 13 May 2010 19:53:18 +0000 (15:53 -0400)
placement of dependency rules between two Table objects
for use within create_all(), drop_all(), sorted_tables.
[ticket:1801]

CHANGES
lib/sqlalchemy/schema.py
lib/sqlalchemy/sql/util.py
test/engine/test_metadata.py

diff --git a/CHANGES b/CHANGES
index 61cec42d251b7596da8911a80f8fb78eb59266ae..3a41e098c786697aada99d08f21dd5297e5fc1ad 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -26,6 +26,11 @@ CHANGES
     is like `col.in_(text("select id from table"))`.
     [ticket:1793]
 
+  - Added table.add_is_dependent_on(othertable), allows manual
+    placement of dependency rules between two Table objects
+    for use within create_all(), drop_all(), sorted_tables.
+    [ticket:1801]
+
   - Fixed bug that prevented implicit RETURNING from functioning
     properly with composite primary key that contained zeroes.
     [ticket:1778]
index 168296db61ac699df9b6ea853c5f06bf205b6dee..a2d499f8454527b898e8654a92abe192a2418709 100644 (file)
@@ -224,6 +224,7 @@ class Table(SchemaItem, expression.TableClause):
         self._columns = expression.ColumnCollection()
         self._set_primary_key(PrimaryKeyConstraint())
         self._foreign_keys = util.OrderedSet()
+        self._extra_dependencies = set()
         self.ddl_listeners = util.defaultdict(list)
         self.kwargs = {}
         if self.schema is not None:
@@ -338,6 +339,20 @@ class Table(SchemaItem, expression.TableClause):
 
         return self.metadata and self.metadata.bind or None
 
+    def add_is_dependent_on(self, table):
+        """Add a 'dependency' for this Table.
+        
+        This is another Table object which must be created
+        first before this one can, or dropped after this one.
+        
+        Usually, dependencies between tables are determined via 
+        ForeignKey objects.   However, for other situations that 
+        create dependencies outside of foreign keys (rules, inheriting),
+        this method can manually establish such a link.
+        
+        """
+        self._extra_dependencies.add(table)
+        
     def append_column(self, column):
         """Append a ``Column`` to this ``Table``."""
 
index e4ebe953844580f4040a6cc420b99b972bd90461..14ea42d2c723c9c094522e193a11bf63cf2eebe7 100644 (file)
@@ -22,6 +22,11 @@ def sort_tables(tables):
         visitors.traverse(table, 
                             {'schema_visitor':True}, 
                             {'foreign_key':visit_foreign_key})
+
+        tuples.extend(
+            [parent, table] for parent in table._extra_dependencies
+        )
+                            
     return list(topological.sort(tuples, tables))
 
 def find_join_source(clauses, join_to):
index 41b744d9bb9a1c04ea4130717a5bfa27c6a8a2e3..25a9a6d140349510351f849d92524a2fb3dd2a99 100644 (file)
@@ -250,6 +250,25 @@ class MetaDataTest(TestBase, ComparesTables):
         eq_(str(table_c.join(table2_c).onclause), str(table_c.c.myid == table2_c.c.myid))
         eq_(str(table_c.join(table2_c).onclause), "myschema.mytable.myid = myschema.othertable.myid")
 
+    def test_manual_dependencies(self):
+        meta = MetaData()
+        a = Table('a', meta, Column('foo', Integer))
+        b = Table('b', meta, Column('foo', Integer))
+        c = Table('c', meta, Column('foo', Integer))
+        d = Table('d', meta, Column('foo', Integer))
+        e = Table('e', meta, Column('foo', Integer))
+        
+        e.add_is_dependent_on(c)
+        a.add_is_dependent_on(b)
+        b.add_is_dependent_on(d)
+        e.add_is_dependent_on(b)
+        c.add_is_dependent_on(a)
+        eq_(
+            meta.sorted_tables,
+            [d, b, a, c, e]
+        )
+        
+        
     def test_tometadata_strip_schema(self):
         meta = MetaData()