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.

Reply via email to