- changed watchers to bogun.dmitriy@gmail.com
bug in query.update() upon expire/fetch of cols with alternate attr names
Issue #1935
resolved
from sqlalchemy import *
from sqlalchemy import orm
from sqlalchemy.ext.declarative import declarative_base
decl = declarative_base()
class data(decl):
__tablename__ = 'data'
idnr = Column(Integer, primary_key=True)
cnt = Column('counter', Integer, nullable=False, default=0)
eng = create_engine('sqlite://', echo=True)
sm = orm.sessionmaker(bind=eng, autoflush=False, autocommit=False)
decl.metadata.create_all(eng)
ses = sm()
e = data()
ses.add(e)
ses.commit()
ses.close()
ses = sm()
q = ses.query(data)
for e in q:
q2 = ses.query(data).filter(data.idnr==e.idnr)
q2.update({data.cnt: data.cnt + 1})
ses.commit()
patch:
diff -r 2a2257b1e7d4abb8a7657e10542e0fa45c80a8ca lib/sqlalchemy/orm/query.py
--- a/lib/sqlalchemy/orm/query.py Wed Sep 29 10:34:45 2010 -0400
+++ b/lib/sqlalchemy/orm/query.py Thu Sep 30 10:27:39 2010 -0400
@@ -32,7 +32,7 @@
from sqlalchemy.orm.util import (
AliasedClass, ORMAdapter, _entity_descriptor, _entity_info,
_is_aliased_class, _is_mapped_class, _orm_columns, _orm_selectable,
- join as orm_join,with_parent
+ join as orm_join,with_parent, _attr_as_key
)
@@ -2204,7 +2204,7 @@
value_evaluators = {}
for key,value in values.iteritems():
- key = expression._column_as_key(key)
+ key = _attr_as_key(key)
value_evaluators[key](key) = evaluator_compiler.process(
expression._literal_as_binds(value))
except evaluator.UnevaluatableError:
@@ -2259,7 +2259,7 @@
if identity_key in session.identity_map:
session.expire(
session.identity_map[identity_key](identity_key),
- [for k in values](expression._column_as_key(k))
+ [for k in values](_attr_as_key(k))
)
for ext in session.extensions:
diff -r 2a2257b1e7d4abb8a7657e10542e0fa45c80a8ca lib/sqlalchemy/orm/util.py
--- a/lib/sqlalchemy/orm/util.py Wed Sep 29 10:34:45 2010 -0400
+++ b/lib/sqlalchemy/orm/util.py Thu Sep 30 10:27:39 2010 -0400
@@ -582,6 +582,12 @@
mapper, selectable, is_aliased_class = _entity_info(entity)
return selectable
+def _attr_as_key(attr):
+ if hasattr(attr, 'key'):
+ return attr.key
+ else:
+ return expression._column_as_key(attr)
+
def _is_aliased_class(entity):
return isinstance(entity, AliasedClass)
Comments (3)
-
reporter -
reporter - changed status to resolved
-
reporter - removed milestone
Removing milestone: 0.6.5 (automated comment)
- Log in to comment