bug in query.update() upon expire/fetch of cols with alternate attr names

Issue #1935 resolved
Mike Bayer repo owner created an issue
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)

  1. Log in to comment