From: Michael Trier Date: Thu, 11 Dec 2008 21:52:11 +0000 (+0000) Subject: Corrected problem with bindparams not working properly with Query.delete and Query... X-Git-Tag: rel_0_5_0~112 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=887c403f763fae9e0f6697b31a31e263174d06c9;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Corrected problem with bindparams not working properly with Query.delete and Query.update. Thanks zzzeek. Fixes #1242. --- diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py index 1922c5ac6c..9b491896d6 100644 --- a/lib/sqlalchemy/orm/query.py +++ b/lib/sqlalchemy/orm/query.py @@ -1371,11 +1371,11 @@ class Query(object): if synchronize_session == 'fetch': #TODO: use RETURNING when available select_stmt = context.statement.with_only_columns(primary_table.primary_key) - matched_rows = session.execute(select_stmt).fetchall() + matched_rows = session.execute(select_stmt, params=self._params).fetchall() if self._autoflush: session._autoflush() - result = session.execute(delete_stmt) + result = session.execute(delete_stmt, params=self._params) if synchronize_session == 'evaluate': target_cls = self._mapper_zero().class_ @@ -1456,11 +1456,11 @@ class Query(object): if synchronize_session == 'expire': select_stmt = context.statement.with_only_columns(primary_table.primary_key) - matched_rows = session.execute(select_stmt).fetchall() + matched_rows = session.execute(select_stmt, params=self._params).fetchall() if self._autoflush: session._autoflush() - result = session.execute(update_stmt) + result = session.execute(update_stmt, params=self._params) if synchronize_session == 'evaluate': target_cls = self._mapper_zero().class_ diff --git a/test/orm/query.py b/test/orm/query.py index 5d60335dd5..d0acc5e45e 100644 --- a/test/orm/query.py +++ b/test/orm/query.py @@ -2601,7 +2601,17 @@ class UpdateDeleteTest(_base.MappedTest): assert john not in sess and jill not in sess eq_(sess.query(User).order_by(User.id).all(), [jack,jane]) - + + @testing.resolve_artifact_names + def test_delete_with_bindparams(self): + sess = create_session(bind=testing.db, autocommit=False) + + john,jack,jill,jane = sess.query(User).order_by(User.id).all() + sess.query(User).filter('name = :name').params(name='john').delete() + assert john not in sess + + eq_(sess.query(User).order_by(User.id).all(), [jack,jill,jane]) + @testing.resolve_artifact_names def test_delete_rollback(self): sess = sessionmaker()() @@ -2664,6 +2674,17 @@ class UpdateDeleteTest(_base.MappedTest): eq_([john.age, jack.age, jill.age, jane.age], [25,37,29,27]) eq_(sess.query(User.age).order_by(User.id).all(), zip([25,37,29,27])) + @testing.resolve_artifact_names + def test_update_with_bindparams(self): + sess = create_session(bind=testing.db, autocommit=False) + + john,jack,jill,jane = sess.query(User).order_by(User.id).all() + + sess.query(User).filter('age > :x').params(x=29).update({'age': User.age - 10}, synchronize_session='evaluate') + + eq_([john.age, jack.age, jill.age, jane.age], [25,37,29,27]) + eq_(sess.query(User.age).order_by(User.id).all(), zip([25,37,29,27])) + @testing.resolve_artifact_names def test_update_changes_resets_dirty(self): sess = create_session(bind=testing.db, autocommit=False, autoflush=False)