bojanb wrote: > > This does it. One small drawback is that since the field is now > defined as an attribute, one can't query on it (ie. session.query > (class_).filter_by(modified_by='jack')), but we don't envison such a > use case for this funcionality so it's OK for us.
you get this by using "synonym()" for the new "modified" attribute on each mapper. I left this out of the example to avoid confusion. > > Recap of what was done: table columns were defined as 'modified', but > these columns were renamed in mappers as '<tablename>_modified'. Then, > a 'modified' attribute was added to all classes (well, to the > superclass to that effect) that wraps the value of > 'tablename_modified'. Phew! > > On Nov 12, 5:06 pm, "Michael Bayer" <mike...@zzzcomputing.com> wrote: >> xaotuk wrote: >> >> > We have tried suggested, but: field 'modified' exists in both parent >> > and child tables, when we redefined property 'modified' in mapper with >> > something like this: >> > mapper(Child, child_table, properties={'modified' = >> > child_table.c.modified, ...}), modified field still returned value >> > from parent's table. >> >> here is an example illustrating how to move "modified" away as an >> attribute name within each mapped class, allowing them to be accessible >> separately despite the tables having the same column names. If you want >> to set the parent's "modified" column on the child, use the >> "parent_modified" attribute: >> >> from sqlalchemy import * >> from sqlalchemy.orm import * >> >> engine = create_engine("sqlite://", echo=True) >> >> m = MetaData() >> >> parent = Table('parent', m, >> Column('id', Integer, primary_key=True), >> Column('type', String), >> Column('modified', String) >> ) >> >> child = Table('child', m, >> Column('id', Integer, ForeignKey('parent.id'), >> primary_key=True), >> Column('modified', String) >> ) >> m.create_all(engine) >> >> class Parent(object): >> def __init__(self, modified): >> self.modified = modified >> >> def modified(self): >> return self.parent_modified >> >> def _set_modified(self, m): >> self.parent_modified = m >> >> modified = property(modified, _set_modified) >> >> class Child(Parent): >> def modified(self): >> return self.child_modified >> >> def _set_modified(self, m): >> self.child_modified = m >> >> modified = property(modified, _set_modified) >> >> mapper(Parent, parent, polymorphic_on=parent.c.type, >> polymorphic_identity='parent', properties={ >> 'parent_modified':parent.c.modified}) >> >> mapper(Child, child, inherits=Parent, polymorphic_identity='child', >> properties={ >> 'child_modified':child.c.modified >> >> }) >> >> s = sessionmaker(engine)() >> >> p1 = Parent('p1') >> c1 = Child('c1') >> assert p1.modified == 'p1' >> assert c1.modified == 'c1' >> >> s.add_all([p1, c1]) >> s.commit() >> assert p1.modified == 'p1' >> assert c1.modified == 'c1' >> >> >> >> > We also tried to add property to class like this: >> >> > class Parent(object) : >> > table = None >> > ... >> > def _fieldFromQuery(self, field): >> > if not self.table: >> > return None >> > return Session.object_session(self).execute(select([getattr >> > (self.table.c, field)]).where(self.table.c.id==self.id)).scalar() >> >> > def _modified(self): >> > return self._fieldFromQuery("modified") >> >> > def _modified_by(self): >> > return self._fieldFromQuery("modified_by") >> >> > modified = property(_modified) >> > modified_by = property(_modified_by) >> >> > where self.table is assigned just before mapper is created. >> > Mapper itself again redefined attribute 'modified' and 'modified_by' >> > so we were back to starting problem. >> >> > On Oct 29, 3:56 pm, "Michael Bayer" <mike...@zzzcomputing.com> wrote: >> >>bojanbwrote: >> >> >> > Hi, >> >> >> > Can I have identical column names in both parent and child classes >> >> > that are part of a joined-table inheritance? These are simply >> created, >> >> > created_by, modified, modified_by columns that are populated by >> >> > defaults defined for them (ie. default, server_default, onupdate). >> >> >> > The values are written to the database correctly, but I have a >> problem >> >> > reading them because parent's column values override child values. >> So, >> >> > if the parent has null values for modified, modified_by and the >> child >> >> > some actual values, ORM returns None for child.modified and >> >> > child.modified_by. >> >> >> use the "properties" dictionary to mapper to redefine the names. or >> the >> >> declarative equivalent. >> >> seehttp://www.sqlalchemy.org/docs/05/mappers.html#customizing-column-pro... >> >> >> > Suggestions? > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@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 -~----------~----~----~----~------~----~------~--~---