]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
keep ordering of columns with mixins constant
authorChris Withers <chris@simplistix.co.uk>
Fri, 2 Jul 2010 13:57:19 +0000 (14:57 +0100)
committerChris Withers <chris@simplistix.co.uk>
Fri, 2 Jul 2010 13:57:19 +0000 (14:57 +0100)
lib/sqlalchemy/ext/declarative.py
test/ext/test_declarative.py

index 385e0a309d9e2eb0fb5f7e4c5c06db0c1a1f1522..7ff6051460dcaea9d32b213083836599f2d19f59 100755 (executable)
@@ -673,7 +673,8 @@ def _as_declarative(cls, classname, dict_):
                         if name not in dict_ and not (
                                 '__table__' in dict_ and name in dict_['__table__'].c
                                 ):
-                            potential_columns[name]=column_copies[obj]=obj.copy()
+                            potential_columns[name] = column_copies[obj] = obj.copy()
+                            column_copies[obj]._creation_order = obj._creation_order
                     elif isinstance(obj, RelationshipProperty):
                         raise exceptions.InvalidRequestError(
                                             "relationships are not allowed on "
index 04ce401e581116299088f72983c6d2bcc87f891f..7fc356b67604d4e762ec3f31d9e869677af0bbce 100644 (file)
@@ -2236,7 +2236,7 @@ class DeclarativeMixinTest(DeclarativeTestBase):
             __mapper_args__ = dict(polymorphic_identity='specific')
 
         assert Specific.__table__ is Generic.__table__
-        eq_(Generic.__table__.c.keys(),['type', 'value', 'id'])
+        eq_(Generic.__table__.c.keys(),['id', 'type', 'value'])
         assert class_mapper(Specific).polymorphic_on is Generic.__table__.c.type
         eq_(class_mapper(Specific).polymorphic_identity, 'specific')
 
@@ -2262,8 +2262,8 @@ class DeclarativeMixinTest(DeclarativeTestBase):
             id = Column(Integer, ForeignKey('generic.id'), primary_key=True)
         eq_(Generic.__table__.name,'generic')
         eq_(Specific.__table__.name,'specific')
-        eq_(Generic.__table__.c.keys(),['python_type', 'timestamp', 'id'])
-        eq_(Specific.__table__.c.keys(),['id', 'timestamp'])
+        eq_(Generic.__table__.c.keys(),['timestamp', 'id', 'python_type'])
+        eq_(Specific.__table__.c.keys(),['timestamp', 'id'])
         eq_(Generic.__table__.kwargs,{'mysql_engine': 'InnoDB'})
         eq_(Specific.__table__.kwargs,{'mysql_engine': 'InnoDB'})
             
@@ -2291,13 +2291,13 @@ class DeclarativeMixinTest(DeclarativeTestBase):
             id = Column(Integer, ForeignKey('basetype.id'), primary_key=True)
 
         eq_(BaseType.__table__.name,'basetype')
-        eq_(BaseType.__table__.c.keys(),['type', 'id', 'value', 'timestamp'])
+        eq_(BaseType.__table__.c.keys(),['timestamp', 'type', 'id', 'value', ])
         eq_(BaseType.__table__.kwargs,{'mysql_engine': 'InnoDB'})
 
         assert Single.__table__ is BaseType.__table__
 
         eq_(Joined.__table__.name,'joined')
-        eq_(Joined.__table__.c.keys(),['id','timestamp'])
+        eq_(Joined.__table__.c.keys(),['timestamp','id'])
         eq_(Joined.__table__.kwargs,{'mysql_engine': 'InnoDB'})
             
     def test_non_propagating_mixin(self):
@@ -2422,3 +2422,20 @@ class DeclarativeMixinTest(DeclarativeTestBase):
         assert model_col is not mixin_col
         eq_(model_col.name, 'data')
         assert model_col.type.__class__ is Integer
+
+    def test_mixin_column_ordering(self):
+        
+        class Foo(object):
+            col1 = Column(Integer)
+            col3 = Column(Integer)
+            
+        class Bar(object):
+            col2 = Column(Integer)
+            col4 = Column(Integer)
+            
+        class Model(Base, Foo, Bar):
+            id = Column(Integer, primary_key=True)
+            __tablename__ = 'model'
+
+        eq_(Model.__table__.c.keys(),
+            ['col1', 'col3', 'col2', 'col4', 'id'])