diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-10-21 17:29:40 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-10-21 17:29:40 -0400 |
commit | 0ae140aa989ea3868c01af23adfcdcc79b7cb22e (patch) | |
tree | c9d073c1200d490639b5d808c7a1608ddab4d65b | |
parent | fee776dde052b0ad2595305d23b07e96b035d3f5 (diff) | |
parent | 7e0835409cf5ab7f7ac27dc1f619773d84bfe53d (diff) | |
download | sqlalchemy-0ae140aa989ea3868c01af23adfcdcc79b7cb22e.tar.gz |
Merge remote-tracking branch 'origin/pr/139' into pr139
-rw-r--r-- | lib/sqlalchemy/sql/schema.py | 11 | ||||
-rw-r--r-- | test/sql/test_metadata.py | 44 |
2 files changed, 51 insertions, 4 deletions
diff --git a/lib/sqlalchemy/sql/schema.py b/lib/sqlalchemy/sql/schema.py index ef5d79a48..54cf1f529 100644 --- a/lib/sqlalchemy/sql/schema.py +++ b/lib/sqlalchemy/sql/schema.py @@ -728,7 +728,7 @@ class Table(DialectKWArgs, SchemaItem, TableClause): checkfirst=checkfirst) def tometadata(self, metadata, schema=RETAIN_SCHEMA, - referred_schema_fn=None): + referred_schema_fn=None, name=None): """Return a copy of this :class:`.Table` associated with a different :class:`.MetaData`. @@ -785,13 +785,16 @@ class Table(DialectKWArgs, SchemaItem, TableClause): .. versionadded:: 0.9.2 + :param name: optional string name indicating the target table name. + If not specified or None, the table name is retained. """ - + if name is None: + name = self.name if schema is RETAIN_SCHEMA: schema = self.schema elif schema is None: schema = metadata.schema - key = _get_table_key(self.name, schema) + key = _get_table_key(name, schema) if key in metadata.tables: util.warn("Table '%s' already exists within the given " "MetaData - not copying." % self.description) @@ -801,7 +804,7 @@ class Table(DialectKWArgs, SchemaItem, TableClause): for c in self.columns: args.append(c.copy(schema=schema)) table = Table( - self.name, metadata, schema=schema, + name, metadata, schema=schema, *args, **self.kwargs ) for c in self.constraints: diff --git a/test/sql/test_metadata.py b/test/sql/test_metadata.py index 6b8e1bb40..2328e7f73 100644 --- a/test/sql/test_metadata.py +++ b/test/sql/test_metadata.py @@ -678,6 +678,50 @@ class ToMetaDataTest(fixtures.TestBase, ComparesTables): eq_(str(table_c.join(table2_c).onclause), 'myschema.mytable.myid = myschema.othertable.myid') + def test_change_name_retain_metadata(self): + meta = MetaData() + + table = Table('mytable', meta, + Column('myid', Integer, primary_key=True), + Column('name', String(40), nullable=True), + Column('description', String(30), + CheckConstraint("description='hi'")), + UniqueConstraint('name'), + schema='myschema', + ) + + table2 = table.tometadata(table.metadata, name='newtable') + table3 = table.tometadata(table.metadata, schema='newschema', + name='newtable') + + assert table.metadata is table2.metadata + assert table.metadata is table3.metadata + eq_((table.name, table2.name, table3.name), + ('mytable', 'newtable', 'newtable')) + eq_((table.key, table2.key, table3.key), + ('myschema.mytable', 'myschema.newtable', 'newschema.newtable')) + + def test_change_name_change_metadata(self): + meta = MetaData() + meta2 = MetaData() + + table = Table('mytable', meta, + Column('myid', Integer, primary_key=True), + Column('name', String(40), nullable=True), + Column('description', String(30), + CheckConstraint("description='hi'")), + UniqueConstraint('name'), + schema='myschema', + ) + + table2 = table.tometadata(meta2, name='newtable') + + assert table.metadata is not table2.metadata + eq_((table.name, table2.name), + ('mytable', 'newtable')) + eq_((table.key, table2.key), + ('myschema.mytable', 'myschema.newtable')) + def _assert_fk(self, t2, schema, expected, referred_schema_fn=None): m2 = MetaData() existing_schema = t2.schema |