Closed
Description
Migrated issue, originally created by Michael Bayer (@zzzeek)
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.
Metadata
Metadata
Assignees
Labels
Type
Projects
Relationships
Development
No branches or pull requests
Activity
sqlalchemy-bot commentedon Sep 19, 2017
Changes by Michael Bayer (@zzzeek):
sqlalchemy-bot commentedon Sep 19, 2017
Michael Bayer (@zzzeek) wrote:
sqlalchemy-bot commentedon Sep 26, 2017
Michael Bayer (@zzzeek) wrote:
https://gerrit.sqlalchemy.org/531
sqlalchemy-bot commentedon Sep 27, 2017
Michael Bayer (@zzzeek) wrote:
Don't expire "deferred" attributes in make_transient_to_detached
Fixed issue where the :func:
.make_transient_to_detached
functionwould expire all attributes on the target object, including "deferred"
attributes, which has the effect of the attribute being undeferred
for the next refesh, causing an unexpected load of the attribute.
Change-Id: I82a385e3033e3f3c31569b1e908efb5f258d0f27
Fixes: #4084
→ 5abb036
sqlalchemy-bot commentedon Sep 27, 2017
Changes by Michael Bayer (@zzzeek):