From: Ants Aasma Date: Thu, 31 Dec 2009 12:21:30 +0000 (+0000) Subject: Fix invalid behavior of Query.update and Query.delete with evaluate strategy and... X-Git-Tag: rel_0_6beta1~104 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=9825126a6185d63139c9f2845fab6e36b0d79953;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Fix invalid behavior of Query.update and Query.delete with evaluate strategy and no criterion. --- diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py index b57cdf65fe..27433627be 100644 --- a/lib/sqlalchemy/orm/query.py +++ b/lib/sqlalchemy/orm/query.py @@ -1628,7 +1628,8 @@ class Query(object): if self.whereclause is not None: eval_condition = evaluator_compiler.process(self.whereclause) else: - eval_condition = evaluator_compiler.process(expression._Null) + def eval_condition(obj): + return True except evaluator.UnevaluatableError: raise sa_exc.InvalidRequestError("Could not evaluate current criteria in Python. " @@ -1732,8 +1733,8 @@ class Query(object): if self.whereclause is not None: eval_condition = evaluator_compiler.process(self.whereclause) else: - eval_condition = evaluator_compiler.process(expression._Null) - + def eval_condition(obj): + return True value_evaluators = {} for key,value in values.iteritems(): diff --git a/test/orm/test_query.py b/test/orm/test_query.py index 765fd9222b..0d98417f6d 100644 --- a/test/orm/test_query.py +++ b/test/orm/test_query.py @@ -3705,3 +3705,23 @@ class UpdateDeleteTest(_base.MappedTest): eq_(sess.query(Document.title).all(), zip(['baz'])) + @testing.resolve_artifact_names + def test_update_all(self): + sess = create_session(bind=testing.db, autocommit=False) + + john,jack,jill,jane = sess.query(User).order_by(User.id).all() + sess.query(User).update({'age': 42}, synchronize_session='evaluate') + + eq_([john.age, jack.age, jill.age, jane.age], [42,42,42,42]) + eq_(sess.query(User.age).order_by(User.id).all(), zip([42,42,42,42])) + + @testing.resolve_artifact_names + def test_delete_all(self): + sess = create_session(bind=testing.db, autocommit=False) + + john,jack,jill,jane = sess.query(User).order_by(User.id).all() + sess.query(User).delete(synchronize_session='evaluate') + + assert not (john in sess or jack in sess or jill in sess or jane in sess) + eq_(sess.query(User).count(), 0) +