orm query.update() raises KeyError exception after a query.get() has been called
Issue #1434
resolved
Calling update() causes an exception any time that a record is affected that was previously fetched using get() in the same session.
Observe this example code from the documentation. The last line was added to illustrate how an exception might occur:
from sqlalchemy import *
engine = create_engine('sqlite:///:memory:', echo=True)
metadata = MetaData()
users_table = Table('users', metadata,
Column('id', Integer, primary_key=True),
Column('name', String),
Column('fullname', String),
Column('password', String)
)
metadata.create_all(engine)
class User(object):
def __init__(self, name, fullname, password):
self.name = name
self.fullname = fullname
self.password = password
def __repr__(self):
return "<User('%s','%s', '%s')>" % (self.name, self.fullname, self.password)
from sqlalchemy.orm import mapper
mapper(User, users_table)
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()
ed_user = User('ed', 'Ed Jones', 'edspassword')
session.add(ed_user)
our_user = session.query(User).filter_by(name='ed').first()
#Blows up...
session.query(User).filter(User.name == 'ed').update({ User.fullname : "new fullname" })
I hope this is clear. This is the stacktrace that is produced:
File "./sa/test/lib/python2.6/site-packages/SQLAlchemy-0.5.4p2-py2.6.egg/sqlalchemy/orm/query.py", line 1704, in update
session.expire(session.identity_map[identity_key](identity_key), values.keys())
File "./sa/test/lib/python2.6/site-packages/SQLAlchemy-0.5.4p2-py2.6.egg/sqlalchemy/orm/session.py", line 959, in expire
_expire_state(state, attribute_names=attribute_names, instance_dict=self.identity_map)
File "./sa/test/lib/python2.6/site-packages/SQLAlchemy-0.5.4p2-py2.6.egg/sqlalchemy/orm/state.py", line 217, in expire_attributes
impl = self.manager[key](key).impl
KeyError: <sqlalchemy.orm.attributes.InstrumentedAttribute object at 0x27fb9d0>
Comments (2)
-
Account Deleted -
repo owner - changed status to duplicate
- Log in to comment
Please close this ticket. It is an accidental duplicate.
#1436is the correct ticket