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.
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.