Hi,

I have a table-mapped attribute that is dependent on two other
attributes:

from sqlalchemy import Table, MetaData, Column, Text, create_engine,
Integer
from sqlalchemy.orm import mapper, synonym

class Foo(object):
    def _get_name(self):
        return self._name
    def _set_name(self, name):
        self._name = name
        self._update_table_name()
    name = property(_get_name, _set_name)

    def _get_provider(self):
        return self._provider
    def _set_provider(self, provider):
        self._provider = provider
        self._update_table_name()
    provider = property(_get_provider, _set_provider)

    def _update_table_name(self):
        table_name = "%s_%s" % (self.provider, self.name)
        if len(table_name) > 50:
            table_name = table_name[0:50]
        self.table_name = table_name

foo_table = Table('foo', MetaData(),
                  Column('id', Integer, primary_key=True),
                  Column('name', Text),
                  Column('provider', Text),
                  Column('table_name', Text)
                  )
mapper(Foo, foo_table, properties={
    'name' : synonym('_name', map_column=True),
    'provider': synonym('_provider', map_column=True),
                                   })

e = create_engine('sqlite:///:memory:')
foo_table.metadata.create_all(bind=e)

When I run this normally, nothing happens. When I run it under the
debugger (in PyDev), I get infinite recursion, looking like this:

Traceback (most recent call last):
  File "/Applications/eclipse/plugins/
org.python.pydev.debug_1.4.4.2636/pysrc/pydevd.py", line 883, in
<module>
    debugger.run(setup['file'], None, None)
  File "/Applications/eclipse/plugins/
org.python.pydev.debug_1.4.4.2636/pysrc/pydevd.py", line 712, in run
    execfile(file, globals, locals) #execute the script
  File "/Users/gthb/Documents/workspace/test/src/sqlalchemytest7.py",
line 33, in <module>
    'provider': synonym('_provider', map_column=True),
  File "/path/to/SQLAlchemy/sqlalchemy/orm/__init__.py", line 752, in
mapper
    return Mapper(class_, local_table, *args, **params)
  File "/path/to/SQLAlchemy/sqlalchemy/orm/mapper.py", line 198, in
__init__
    self._configure_properties()
  File "/path/to/SQLAlchemy/sqlalchemy/orm/mapper.py", line 481, in
_configure_properties
    self._configure_property(key, prop, False)
  File "/path/to/SQLAlchemy/sqlalchemy/orm/mapper.py", line 616, in
_configure_property
    prop.instrument_class(self)
  File "/path/to/SQLAlchemy/sqlalchemy/orm/properties.py", line 302,
in instrument_class
    proxy_property=self.descriptor
  File "/path/to/SQLAlchemy/sqlalchemy/orm/attributes.py", line 1590,
in register_descriptor
    descriptor = proxy_type(key, proxy_property, comparator,
parententity)
  File "/path/to/SQLAlchemy/sqlalchemy/orm/attributes.py", line 181,
in __init__
    self.descriptor = self.user_prop = descriptor
  File "/Users/gthb/Documents/workspace/test/src/sqlalchemytest7.py",
line 14, in _set_name
    self._update_table_name()
  File "/path/to/SQLAlchemy/sqlalchemy/orm/attributes.py", line 214,
in __getattr__
    return getattr(self._comparator, attribute)
  File "/path/to/SQLAlchemy/sqlalchemy/orm/attributes.py", line 214,
in __getattr__
    return getattr(self._comparator, attribute)
  ....

The same can be reproduced outside of PyDev by doing:

python -m pdb sqlalchemytest7.py

and stepping until the above calamity strikes. (It seems it does not
happen on cont)

This is in python 2.5.2 on Mac OS X 10.5.6, with sqlalchemy 0.5.2.

So, two things:

1) what am I doing wrong?

2) SQLAlchemy should handle it more gracefully. :)

Regards,

    - Gulli

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