I have code that looks like the following:

games = session.query(Game)
game = [g for g in games][0]
court = game.court # StaleDataError
game.
session.add(game)

Game looks like:

class Game(Base):
    __tablename__ = "Games"
    id = Column(Integer, primary_key=True)
    courtId = Column('courtId', Integer, ForeignKey('Courts.id'))
    courtId = Column('courtId', Integer, ForeignKey('Courts.id'))
    court = relationship(Court, foreign_keys=[courtId], backref="games")
    revision = Column(Integer, nullable=False)

    __mapper_args__ = {
        'version_id_col': revision
    }


I've found that this error occurs when another process has updated the same 
row, which makes sense, since that is the purpose of the version_id_col. 
In the contrived example above, it's been difficult to reproduce the error. 
In production, I have found this happens consistently, so long as another 
process has updated the same Game row. 

I can easily wrap a "try/except" around where "court" is accessed from 
"game", but I'm curious as to why an UPDATE statement happens there in the 
first place.

Below is the stacktrace:

    court = game.court
  File 
"/home/prism/.local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py", 
line 243, in __get__
    return self.impl.get(instance_state(instance), dict_)
  File 
"/home/prism/.local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py", 
line 602, in get
    value = self.callable_(state, passive)
  File 
"/home/prism/.local/lib/python2.7/site-packages/sqlalchemy/orm/strategies.py", 
line 634, in _load_for_state
    session, state, primary_key_identity, passive)
  File "<string>", line 1, in <lambda>
  File 
"/home/prism/.local/lib/python2.7/site-packages/sqlalchemy/orm/strategies.py", 
line 727, in _emit_lazyload
    primary_key_identity)
  File 
"/home/prism/.local/lib/python2.7/site-packages/sqlalchemy/ext/baked.py", 
line 570, in _load_on_pk_identity
    result = list(bq.for_session(self.session).params(**params))
  File 
"/home/prism/.local/lib/python2.7/site-packages/sqlalchemy/ext/baked.py", 
line 410, in __iter__
    self.session._autoflush()
  File 
"/home/prism/.local/lib/python2.7/site-packages/sqlalchemy/orm/session.py", 
line 1493, in _autoflush
    self.flush()
  File 
"/home/prism/.local/lib/python2.7/site-packages/sqlalchemy/orm/session.py", 
line 2313, in flush
    self._flush(objects)
  File 
"/home/prism/.local/lib/python2.7/site-packages/sqlalchemy/orm/session.py", 
line 2440, in _flush
    transaction.rollback(_capture_exception=True)
  File 
"/home/prism/.local/lib/python2.7/site-packages/sqlalchemy/util/langhelpers.py",
 
line 66, in __exit__
    compat.reraise(exc_type, exc_value, exc_tb)
  File 
"/home/prism/.local/lib/python2.7/site-packages/sqlalchemy/orm/session.py", 
line 2404, in _flush
    flush_context.execute()
  File 
"/home/prism/.local/lib/python2.7/site-packages/sqlalchemy/orm/unitofwork.py", 
line 398, in execute
    rec.execute(self)
  File 
"/home/prism/.local/lib/python2.7/site-packages/sqlalchemy/orm/unitofwork.py", 
line 563, in execute
    uow
  File 
"/home/prism/.local/lib/python2.7/site-packages/sqlalchemy/orm/persistence.py", 
line 177, in save_obj
    mapper, table, update)
  File 
"/home/prism/.local/lib/python2.7/site-packages/sqlalchemy/orm/persistence.py", 
line 797, in _emit_update_statements
    (table.description, len(records), rows))
StaleDataError: UPDATE statement on table 'Games' expected to update 1 
row(s); 0 were matched.

Environment:
Python 2.7
SQLAlchemy 1.3.0b1
Oracle

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
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 view this discussion on the web visit 
https://groups.google.com/d/msgid/sqlalchemy/c25108de-14e1-400b-a3d0-439fda06ed17%40googlegroups.com.

Reply via email to