From: Mike Bayer Date: Tue, 11 Aug 2020 21:46:11 +0000 (-0400) Subject: Correct for update.ordered_values() and use in new test X-Git-Tag: rel_1_4_0b1~184 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=180ae7c1a53385f72b0047496ac001ec5099cc3e;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Correct for update.ordered_values() and use in new test The test for the parameter fix in c0685e5f41 was not working deterministically on Python 2, so use ordered_values(), however a second issue in ordered_values() was assuming each element was a column, so also test for array-assignment expressions with ordered_values. Change-Id: I944c72a52700ffb4ab5ae1a83ae21f1efc84b505 --- diff --git a/lib/sqlalchemy/sql/crud.py b/lib/sqlalchemy/sql/crud.py index 7d0616da71..b049b2f337 100644 --- a/lib/sqlalchemy/sql/crud.py +++ b/lib/sqlalchemy/sql/crud.py @@ -337,9 +337,11 @@ def _scan_cols( _column_as_key(key) for key in compile_state._parameter_ordering ] ordered_keys = set(parameter_ordering) - cols = [stmt.table.c[key] for key in parameter_ordering] + [ - c for c in stmt.table.c if c.key not in ordered_keys - ] + cols = [ + stmt.table.c[key] + for key in parameter_ordering + if isinstance(key, util.string_types) and key in stmt.table.c + ] + [c for c in stmt.table.c if c.key not in ordered_keys] else: cols = stmt.table.columns diff --git a/test/sql/test_update.py b/test/sql/test_update.py index 5db5fed11c..1eed378326 100644 --- a/test/sql/test_update.py +++ b/test/sql/test_update.py @@ -873,7 +873,9 @@ class UpdateTest(_UpdateFromTestBase, fixtures.TablesTest, AssertsCompiledSQL): column("data2", ARRAY(Integer)), ) - stmt = t.update().values({t.c.data1[5]: 7, t.c.data2[10]: 18}) + stmt = t.update().ordered_values( + (t.c.data1[5], 7), (t.c.data2[10], 18) + ) dialect = default.StrCompileDialect() dialect.paramstyle = "qmark" dialect.positional = True