]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
tometadata now copies indexes as well
authorChris Withers <chris@simplistix.co.uk>
Thu, 16 Sep 2010 19:58:15 +0000 (20:58 +0100)
committerChris Withers <chris@simplistix.co.uk>
Thu, 16 Sep 2010 19:58:15 +0000 (20:58 +0100)
lib/sqlalchemy/schema.py
test/engine/test_metadata.py

index e61f17d8e9396aafceb634e889b5c6b9aeca3eea..fc5dd33df3f7a11969b798bdf5be8279fd55166e 100644 (file)
@@ -478,7 +478,28 @@ class Table(SchemaItem, expression.TableClause):
                 args.append(c.copy(schema=schema))
             for c in self.constraints:
                 args.append(c.copy(schema=schema))
-            return Table(self.name, metadata, schema=schema, *args, **self.kwargs)
+            table = Table(
+                self.name, metadata, schema=schema,
+                *args, **self.kwargs
+                )
+            copied_already = set()
+            for i in table.indexes:
+                entry = [i.name,i.unique]
+                entry.extend(sorted(i.kwargs.items()))
+                entry.extend(i.columns.keys())
+                copied_already.add(tuple(entry))
+            for i in self.indexes:
+                cols = i.columns.keys()
+                entry = [i.name,i.unique]
+                entry.extend(sorted(i.kwargs.items()))
+                entry.extend(cols)
+                if tuple(entry) not in copied_already:
+                    kwargs = dict(i.kwargs)
+                    kwargs['unique']=i.unique
+                    Index(i.name,
+                          *[getattr(table.c,col) for col in cols],
+                          **kwargs)
+            return table
 
 class Column(SchemaItem, expression.ColumnClause):
     """Represents a column in a database table."""
index 5c6f5c1515f7735b9140d51d22cf6cae7eeb74d2..a99188f15e7be64697970f25ffc4142be5eeb0a3 100644 (file)
@@ -2,7 +2,7 @@ from sqlalchemy.test.testing import assert_raises, assert_raises_message
 import pickle
 from sqlalchemy import Integer, String, UniqueConstraint, \
     CheckConstraint, ForeignKey, MetaData, Sequence, \
-    ForeignKeyConstraint, ColumnDefault
+    ForeignKeyConstraint, ColumnDefault, Index
 from sqlalchemy.test.schema import Table, Column
 from sqlalchemy import schema, exc
 import sqlalchemy as tsa
@@ -259,6 +259,31 @@ class MetaDataTest(TestBase, ComparesTables):
 
         eq_(table.kwargs,table_c.kwargs)
 
+    def test_tometadata_indexes(self):
+        meta = MetaData()
+
+        table = Table('mytable', meta,
+            Column('id', Integer, primary_key=True),
+            Column('data1', Integer, index=True),
+            Column('data2', Integer),
+        )
+        Index('multi',table.c.data1,table.c.data2),
+        
+        meta2 = MetaData()
+        table_c = table.tometadata(meta2)
+
+        def _get_key(i):
+            entry = [i.name,i.unique]
+            entry.extend(sorted(i.kwargs.items()))
+            entry.extend(i.columns.keys())
+
+        table_indexes = [_get_key(i) for i in table.indexes]
+        table_indexes.sort()
+        table_c_indexes = [_get_key(i) for i in table_c.indexes]
+        table_c_indexes.sort()
+            
+        eq_(table_indexes,table_c_indexes)
+
     def test_tometadata_default_schema(self):
         meta = MetaData()