# special logic that only occurs for multi-table UPDATE
# statements
if compile_state.isupdate and compile_state.is_multitable:
- _get_multitable_params(
+ _get_update_multitable_params(
compiler,
stmt,
compile_state,
if compile_state._has_multi_parameters:
values = _extend_values_for_multiparams(
- compiler, stmt, compile_state, values, kw
+ compiler,
+ stmt,
+ compile_state,
+ values,
+ _column_as_key,
+ kw,
)
elif (
not values
return _create_update_prefetch_bind_param(compiler, col, **kw)
-def _get_multitable_params(
+def _get_update_multitable_params(
compiler,
stmt,
compile_state,
compiler.postfetch.append(c)
-def _extend_values_for_multiparams(compiler, stmt, compile_state, values, kw):
+def _extend_values_for_multiparams(
+ compiler,
+ stmt,
+ compile_state,
+ values,
+ _column_as_key,
+ kw,
+):
values_0 = values
values = [values]
for i, row in enumerate(compile_state._multi_parameters[1:]):
extension = []
+
+ row = {_column_as_key(key): v for key, v in row.items()}
+
for (col, col_expr, param) in values_0:
- if col in row or col.key in row:
- key = col if col in row else col.key
+ if col.key in row:
+ key = col.key
if coercions._is_literal(row[key]):
new_param = _create_bind_param(
from sqlalchemy.testing import fixtures
+class ORMExpr(object):
+ def __init__(self, col):
+ self.col = col
+
+ def __clause_element__(self):
+ return self.col
+
+
class _InsertTestBase(object):
@classmethod
def define_tables(cls, metadata):
dialect=dialect,
)
- def test_named_with_column_objects(self):
+ @testing.combinations(("strings",), ("columns",), ("inspectables",))
+ def test_named_with_column_objects(self, column_style):
table1 = self.tables.mytable
+ if column_style == "strings":
+ myid, name, description = "myid", "name", "description"
+
+ elif column_style == "columns":
+ myid, name, description = (
+ table1.c.myid,
+ table1.c.name,
+ table1.c.description,
+ )
+ elif column_style == "inspectables":
+
+ myid, name, description = (
+ ORMExpr(table1.c.myid),
+ ORMExpr(table1.c.name),
+ ORMExpr(table1.c.description),
+ )
+ else:
+ assert False
+
values = [
- {table1.c.myid: 1, table1.c.name: "a", table1.c.description: "b"},
- {table1.c.myid: 2, table1.c.name: "c", table1.c.description: "d"},
- {table1.c.myid: 3, table1.c.name: "e", table1.c.description: "f"},
+ {myid: 1, name: "a", description: "b"},
+ {myid: 2, name: "c", description: "d"},
+ {myid: 3, name: "e", description: "f"},
]
checkparams = {
dialect=postgresql.dialect(),
)
- def test_python_scalar_default(self):
+ @testing.combinations(("strings",), ("columns",), ("inspectables",))
+ def test_python_scalar_default(self, key_type):
metadata = MetaData()
table = Table(
"sometable",
Column("foo", Integer, default=10),
)
+ if key_type == "strings":
+ id_, data, foo = "id", "data", "foo"
+ elif key_type == "columns":
+ id_, data, foo = table.c.id, table.c.data, table.c.foo
+ elif key_type == "inspectables":
+ id_, data, foo = (
+ ORMExpr(table.c.id),
+ ORMExpr(table.c.data),
+ ORMExpr(table.c.foo),
+ )
+ else:
+ assert False
+
values = [
- {"id": 1, "data": "data1"},
- {"id": 2, "data": "data2", "foo": 15},
- {"id": 3, "data": "data3"},
+ {id_: 1, data: "data1"},
+ {id_: 2, data: "data2", foo: 15},
+ {id_: 3, data: "data3"},
]
checkparams = {