[Sqlalchemy-tickets] Issue #4084: make_transient_to_pending expires deferred attrs making them load
Brought to you by:
zzzeek
From: Michael B. <iss...@bi...> - 2017-09-19 20:37:28
|
New issue 4084: make_transient_to_pending expires deferred attrs making them load on refresh https://bitbucket.org/zzzeek/sqlalchemy/issues/4084/make_transient_to_pending-expires-deferred Michael Bayer: ``` #!python from sqlalchemy import Column, Integer, String, create_engine from sqlalchemy.orm import Session, deferred from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm.session import make_transient_to_detached Base = declarative_base() class MyTable(Base): __tablename__ = 'my_table' id = Column(Integer, primary_key=True) undeferred = Column(String) deferred_column = deferred(Column(String)) e = create_engine("sqlite://", echo=True) Base.metadata.create_all(e) e.execute( "insert into my_table (id, undeferred, " "deferred_column) values (1, 'foo', 'bar')") s = Session(e) def expire_via_detached(): item = MyTable(id=1) make_transient_to_detached(item) s.add(item) item.undeferred assert 'deferred_column' not in item.__dict__ s.close() def expire_normally(): item = s.query(MyTable).first() s.expire(item) item.undeferred assert 'deferred_column' not in item.__dict__ s.close() def expire_explicit_attrs(): item = s.query(MyTable).first() s.expire(item, ['undeferred', 'deferred_column']) item.undeferred assert 'deferred_column' in item.__dict__ s.close() expire_normally() expire_explicit_attrs() expire_via_detached() ``` this is due to state._expire(state, state.unloaded) in make_transient_to_pending(). When a deferred attribute is explicitly expired, it becomes part of the next full load. |