From 27cf184b50ceed185fea57abfb329d2b9f9da935 Mon Sep 17 00:00:00 2001 From: Chris Withers Date: Thu, 16 Sep 2010 20:58:15 +0100 Subject: [PATCH] tometadata now copies indexes as well --- lib/sqlalchemy/schema.py | 23 ++++++++++++++++++++++- test/engine/test_metadata.py | 27 ++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/lib/sqlalchemy/schema.py b/lib/sqlalchemy/schema.py index e61f17d8e9..fc5dd33df3 100644 --- a/lib/sqlalchemy/schema.py +++ b/lib/sqlalchemy/schema.py @@ -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.""" diff --git a/test/engine/test_metadata.py b/test/engine/test_metadata.py index 5c6f5c1515..a99188f15e 100644 --- a/test/engine/test_metadata.py +++ b/test/engine/test_metadata.py @@ -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() -- 2.47.2