svilen wrote:
>
> On Tuesday 11 December 2007 13:13:37 King Simon-NFHD78 wrote:
> > Hi,
> >
> > I used to be able to iterate over mapper.properties.items() to get
> > the name of each mapped property along with the object that
> > implements it. However, in 0.4.1, trying to do this results in a
> > NotImplementedError telling me to use iterate_properties and
> > get_property instead, but I can't see a way to get the name of the
> > property through either of these methods.
> >
> > Is there a generic way that, given a mapped class, I can get a list
> > of the mapped properties with their names?
> iterate_props yields Property instances; maybe p.key is the name u
> want.

Ah yes, p.key was exactly what I was looking for - thanks.

The next part of the question is that I am using this in the
after_insert method of a MapperExtension to write a log file with all
the values that were written to the database. The code looks something
like this:


    mapper = orm.object_mapper(instance)
    for prop in mapper.iterate_properties:
        log.info('   %s=%r',
                 prop.key, getattr(instance, prop.key))


This works nicely for attributes that I set directly. However, it breaks
when it comes across a column that is defined as:

    sa.Column('date_created', sa.DateTime,
              default=sa.func.current_timestamp(type=sa.DateTime))

The attached script should show the problem. The traceback is:

Traceback (most recent call last):
  File "satest.py", line 32, in after_insert
    print "  %s = %r" % (prop.key, getattr(instance, prop.key))
  File
"/home/warranty/python/development/lib/python2.5/site-packages/SQLAlchem
y-0.4.1-py2.5.egg/sqlalchemy/orm/attributes.py", line 40, in __get__
    return self.impl.get(obj._state)
  File
"/home/warranty/python/development/lib/python2.5/site-packages/SQLAlchem
y-0.4.1-py2.5.egg/sqlalchemy/orm/attributes.py", line 215, in get
    value = callable_()
  File
"/home/warranty/python/development/lib/python2.5/site-packages/SQLAlchem
y-0.4.1-py2.5.egg/sqlalchemy/orm/attributes.py", line 628, in
__fire_trigger
    self.trigger(instance, [k for k in self.expired_attributes if k not
in self.dict])
  File
"/home/warranty/python/development/lib/python2.5/site-packages/SQLAlchem
y-0.4.1-py2.5.egg/sqlalchemy/orm/session.py", line 1112, in
load_attributes
    if
object_session(instance).query(instance.__class__)._get(instance._instan
ce_key, refresh_instance=instance, only_load_props=attribute_names) is
None:
AttributeError: 'User' object has no attribute '_instance_key'

I assume the problem is that my date_created column isn't immediately
available at the 'after_insert' stage, because it is generated in the
SQL INSERT statement, but hasn't been read back from the database yet.
Is there a more suitable hook-point than after_insert, where I can
safely read values like this?

Thanks a lot,

Simon

--~--~---------~--~----~------------~-------~--~----~
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 [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Attachment: satest.py
Description: satest.py

Reply via email to