On 7/16/15 11:47 AM, Tom Flannaghan wrote:
We are using sqlalchemy and postgres extensively, and have come across a problem with deferred columns when an object is merged into a session with load=False. Under these conditions, we find that the deferred columns are not deferred - i.e. they loaded when any attribute is accessed, rather than being deferred until explicitly accessed. We are using sqlalchemy 0.9.7 and postgres 9.4.1.

thanks for reporting this issue. https://bitbucket.org/zzzeek/sqlalchemy/issues/3488/columnpopertymerge-w-load-false-calls has been added to address a possible fix targeted at 1.1.

For now, I'd recommend either not using expire() or specifying specific attribute names to expire().





Here's a simple example that illustrates the problem using the following table:

class Port(Base):
    ''' Table port in schema comm. '''
    __tablename__ = "port"
    name          = Column(String, primary_key=True)
    port          = deferred(Column(Integer, unique=True))


First we try querying Port on name:

my_port = session.query(Port).filter_by(name='test_thing').one()
my_port.name

This code produces the following query, showing that the port column is correctly deferred:

2015-07-16 15:44:08.539 : sqlalchemy.engine.base.Engine : base.py:912(_execute_context) : INFO : SELECT comm.port.name AS comm_port_name

FROM comm.port

WHERE comm.port.name = %(name_1)s



Now I expire and expunge the my_port object, and then merge it back into the session with load=False, and access name like this:

session.expire(my_port)
session.expunge(my_port)
new_port = session.merge(my_port, load=False)
new_port.name

Which produces the following query, showing that the port column has not been deferred, and has instead been included in the query that fetches name:

2015-07-16 15:44:08.539 : sqlalchemy.engine.base.Engine : base.py:912(_execute_context) : INFO : SELECT comm.port.port AS comm_port_port, comm.port.name AS comm_port_name

FROM comm.port

WHERE comm.port.name = %(param_1)s


If I do not set load=False, the column is correctly deferred. I've also tried creating a deferred object directly rather than expunging one from the session and the problem still occurs, so it seems to be caused by the load=False option.


Thanks,

Tom

--
You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected] <mailto:[email protected]>. To post to this group, send email to [email protected] <mailto:[email protected]>.
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to