Hi all, I am using declarative to model an existing object hierarchy where there is an abstract part that i model as an hierarchy of mixins and a concrete part where i use joined-table inheritance.
I have a problem when there is attributes with the same name, one overriding the other, in the abstract mixin hierarchy. Maybe I am doing something wrong so suggestions for how to implement this is most welcome. Sample code: import unittest from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, String, Integer, Boolean Base = declarative_base() class AbstractA(object): AttrA = Column(String(50)) def __init__(self, AttrA="AttrA"): self.AttrA = AttrA class AbstractB(AbstractA): AttrA = Column(String(50), primary_key=True) def __init__(self, AttrA, **kwargs): AbstractA.__init__(self, **kwargs) self.AttrA = AttrA class Concrete(Base, AbstractB): __tablename__ = 'Concrete' AttrB = Column(Boolean) def __init__(self, AttrB, **kwargs): AbstractB.__init__(self, **kwargs) self.AttrB = AttrB class TestAttributeOverriding(unittest.TestCase): def testAttributeOverriding(self): concrete = Concrete(AttrB = False, AttrA="0") self.session.add(concrete) self.session.commit() assert len(self.session.query(Concrete).all()) == 1 def setUp(self): self.engine = create_engine('sqlite:///:memory:', echo = True) Session = sessionmaker(bind = self.engine) self.session = Session() self.metadata = Base.metadata self.metadata.create_all(self.engine) def tearDown(self): self.metadata.drop_all(self.engine) self.session.close() This would fail with "could not assemble any primary key columns for mapped table" unless i apply the small patch below, which makes it work as i would expect (although i don't know if this is how it is intended to be): --- /usr/lib/python2.6/site-packages/sqlalchemy/ext/ declarative.py 2010-09-07 19:05:34.000000000 +0200 +++ lib/python2.6/site-packages/SQLAlchemy-0.6.4- py2.6.egg/sqlalchemy/ext/declarative.py 2010-10-21 19:58:15.863671633 +0200 @@ -936,11 +936,13 @@ '__table__' in dict_ and name in dict_['__table__'].c ): - potential_columns[name] = \ - column_copies[obj] = \ - obj.copy() - column_copies[obj]._creation_order = \ - obj._creation_order + if name not in potential_columns: + potential_columns[name] = \ + column_copies[obj] = \ + obj.copy() + column_copies[obj]._creation_order = \ + obj._creation_order + elif isinstance(obj, MapperProperty): raise exceptions.InvalidRequestError( "Mapper properties (i.e. deferred," --- Oystein -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalch...@googlegroups.com. To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.