Deferred columns cause flush to fail when specified through add_property

Issue #831 resolved
cleverdevil created an issue

If you specify a deferred column on a mapper by using add_property rather than using the mapper constructor, the resulting class cannot be flushed. Here is a failing test case:

from sqlalchemy import *
from sqlalchemy.orm import *

metadata = MetaData()
metadata.bind = 'sqlite:///'
metadata.bind.echo = True

org_table = Table('org', metadata,
    Column('id', Integer, primary_key=True),
    Column('name', Unicode),
    Column('stuff', Unicode)
)


class Org(object):
    pass

m = mapper(Org, org_table)
m.add_property('stuff', deferred(org_table.c.stuff))

Session = sessionmaker(bind=metadata.bind)
session = Session()

metadata.create_all()

org = Org(name='Dude')
session.save(org)
session.flush()

This was reported via an Elixir ticket here: http://elixir.ematia.de/trac/ticket/17

Comments (3)

  1. Former user Account Deleted

    (original author: ged) By the way, this worked fined in 0.3, this fails in the same way for synonym properties and it produces the following traceback (also on Elixir ticket):

    Traceback (most recent call last):
      File "/var/lib/python-support/python2.5/nose/case.py", line 132, in runTest
        self.testCase(*self.arg)
      File "/home/ged/devel/elixir/trunk/tests/test_properties.py", line 94, in test_synonym
        session.flush()
      File "/home/ged/devel/sqlalchemy/trunk/lib/sqlalchemy/orm/scoping.py", line 74, in do
        return getattr(self.registry(), name)(*args, **kwargs)
      File "/home/ged/devel/sqlalchemy/trunk/lib/sqlalchemy/orm/session.py", line 681, in flush
        self.uow.flush(self, objects)
      File "/home/ged/devel/sqlalchemy/trunk/lib/sqlalchemy/orm/unitofwork.py", line 216, in flush
        flush_context.execute()
      File "/home/ged/devel/sqlalchemy/trunk/lib/sqlalchemy/orm/unitofwork.py", line 432, in execute
        UOWExecutor().execute(self, head)
      File "/home/ged/devel/sqlalchemy/trunk/lib/sqlalchemy/orm/unitofwork.py", line 1051, in execute
        self.execute_save_steps(trans, task)
      File "/home/ged/devel/sqlalchemy/trunk/lib/sqlalchemy/orm/unitofwork.py", line 1065, in execute_save_steps
        self.save_objects(trans, task)
      File "/home/ged/devel/sqlalchemy/trunk/lib/sqlalchemy/orm/unitofwork.py", line 1056, in save_objects
        task.mapper.save_obj(task.polymorphic_tosave_objects, trans)
      File "/home/ged/devel/sqlalchemy/trunk/lib/sqlalchemy/orm/mapper.py", line 1085, in save_obj
        value = mapper.get_attr_by_column(obj, col, False)
      File "/home/ged/devel/sqlalchemy/trunk/lib/sqlalchemy/orm/mapper.py", line 934, in get_attr_by_column
        return prop.getattr(obj, column)
      File "/home/ged/devel/sqlalchemy/trunk/lib/sqlalchemy/orm/properties.py", line 56, in getattr
        return getattr(object, self.key)
    AttributeError: 'ColumnProperty' object has no attribute 'key'
    
  2. Log in to comment