]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- The copy() method on Column now supports uninitialized,
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 2 Jan 2010 03:50:50 +0000 (03:50 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 2 Jan 2010 03:50:50 +0000 (03:50 +0000)
unnamed Column objects. This allows easy creation of
declarative helpers which place common columns on multiple
subclasses (merged from 0.5 with changes).

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

diff --git a/CHANGES b/CHANGES
index 1fd825d4c3875d2707dfa6df983e3cff287229de..db902e79d8382a46baeaef96b9e5f3ec3a359f1c 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -791,6 +791,12 @@ CHANGES
      
 0.5.8
 =====
+- sql
+    - The copy() method on Column now supports uninitialized,
+      unnamed Column objects. This allows easy creation of 
+      declarative helpers which place common columns on multiple 
+      subclasses.
+      
 - postgresql
     - The extract() function, which was slightly improved in
       0.5.7, needed a lot more work to generate the correct
index 455582c878ea02daf181f97a1fde3ce6c0afe623..ef9137ecd98e45bc21131d05227027e5673b26f4 100644 (file)
@@ -616,8 +616,8 @@ class Column(SchemaItem, expression.ColumnClause):
 
         name = kwargs.pop('name', None)
         type_ = kwargs.pop('type_', None)
+        args = list(args)
         if args:
-            args = list(args)
             if isinstance(args[0], basestring):
                 if name is not None:
                     raise exc.ArgumentError(
@@ -794,10 +794,13 @@ class Column(SchemaItem, expression.ColumnClause):
         This is used in ``Table.tometadata``.
 
         """
+        args = [c.copy(**kw) for c in self.constraints]
+        if self.table is None:
+            args += [c.copy(**kw) for c in self.foreign_keys]
+            
         return Column(
-                self.name, 
-                self.type, 
-                self.default, 
+                name=self.name, 
+                type_=self.type, 
                 key = self.key, 
                 primary_key = self.primary_key, 
                 nullable = self.nullable, 
@@ -808,7 +811,8 @@ class Column(SchemaItem, expression.ColumnClause):
                 server_default=self.server_default,
                 onupdate=self.onupdate,
                 server_onupdate=self.server_onupdate,
-                *[c.copy(**kw) for c in self.constraints])
+                *args
+                )
 
     def _make_proxy(self, selectable, name=None):
         """Create a *proxy* for this column.
@@ -925,7 +929,6 @@ class ForeignKey(SchemaItem):
 
     def copy(self, schema=None):
         """Produce a copy of this ForeignKey object."""
-
         return ForeignKey(
                 self._get_colspec(schema=schema),
                 use_alter=self.use_alter,
@@ -1054,7 +1057,6 @@ class ForeignKey(SchemaItem):
                 return
             raise exc.InvalidRequestError("This ForeignKey already has a parent !")
         self.parent = column
-
         self.parent.foreign_keys.add(self)
         self.parent._on_table_attach(self._set_table)
     
index e2179da09eb30191fe3ce2d666e6b197e250b03e..6e846096bd5b35e46bb72d8a3ad94e30dffcddec 100644 (file)
@@ -36,6 +36,24 @@ class MetaDataTest(TestBase, ComparesTables):
         assert t3 not in metadata
         assert t4 not in metadata
         
+    def test_uninitialized_column_copy(self):
+        for col in [
+            Column('foo', String(), nullable=False),
+            Column(Integer(), primary_key=True),
+            Column('bar', Integer(), Sequence('foo_seq'), primary_key=True, key='bar'),
+            Column(Integer(), ForeignKey('bat.blah')),
+            Column('bar', Integer(), ForeignKey('bat.blah'), primary_key=True, key='bar'),
+        ]:
+            c2 = col.copy()
+            for attr in ('name', 'type', 'nullable', 'primary_key', 'key'):
+                eq_(getattr(col, attr), getattr(c2, attr))
+            eq_(len(col.foreign_keys), len(c2.foreign_keys))
+            if col.default:
+                eq_(c2.default.name, 'foo_seq')
+            for a1, a2 in zip(col.foreign_keys, c2.foreign_keys):
+                assert a1 is not a2
+                eq_(a2._colspec, 'bat.blah')
+            
     def test_dupe_tables(self):
         metadata = MetaData()
         t1 = Table('table1', metadata, Column('col1', Integer, primary_key=True),