Preserve order of inserted column names on multiple insertion

The order of column names must be the same as the list of values to recompose
a correct dictionary of values when raising error message.

Closes #12552
This commit is contained in:
Nicolas Évrard committed 2023-09-10 11:23:19 +02:00
1 parent edd198c949
commit 42cdc26e23
1 file changed
+6 -6
+6 -6
View File
@@ -794,11 +794,11 @@ class ModelSQL(ModelStorage):
new_ids = []
vlist = [v.copy() for v in vlist]
def db_insert(columns, vlist, fields):
def db_insert(columns, vlist, column_names):
if transaction.database.has_multirow_insert():
vlist = (
s for s in grouped_slice(
vlist, in_max // (len(fields) or 1)))
vlist, in_max // (len(column_names) or 1)))
else:
vlist = ([v] for v in vlist)
@@ -846,14 +846,14 @@ class ModelSQL(ModelStorage):
with transaction.new_transaction():
for value in values:
skip = len(['create_uid', 'create_date'])
recomposed = dict(zip(fields, value[skip:]))
recomposed = dict(zip(column_names, value[skip:]))
raise_func(
exception, recomposed, transaction=transaction)
raise
to_insert = []
previous_columns = [table.create_uid, table.create_date]
previous_column_names = set()
previous_column_names = []
for values in vlist:
# Clean values
@@ -888,7 +888,7 @@ class ModelSQL(ModelStorage):
defaults_cache.update(default_values)
values.update(missing_defaults[values_schema])
current_column_names = set()
current_column_names = []
current_columns = [table.create_uid, table.create_date]
current_values = [transaction.user, CurrentTimestamp()]
@@ -898,7 +898,7 @@ class ModelSQL(ModelStorage):
if not hasattr(field, 'set'):
current_columns.append(Column(table, fname))
current_values.append(field.sql_format(value))
current_column_names.add(fname)
current_column_names.append(fname)
if current_column_names != previous_column_names:
if to_insert: