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
-~----------~----~----~----~------~----~------~--~---

Reply via email to