diff options
author | sean_c_hsu <s8901489@gmail.com> | 2020-06-15 00:58:06 +0800 |
---|---|---|
committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2022-01-19 20:17:42 +0100 |
commit | 0f6946495a8ec955b471ca1baaf408ceb53d4796 (patch) | |
tree | c3d867d141074fb990d3140e02fbaa9d717e8ff2 /django/db/models/sql/compiler.py | |
parent | ba9de2e74edb155067dc96a3369305c9ef4ba385 (diff) | |
download | django-0f6946495a8ec955b471ca1baaf408ceb53d4796.tar.gz |
Fixed #31685 -- Added support for updating conflicts to QuerySet.bulk_create().
Thanks Florian Apolloner, Chris Jerdonek, Hannes Ljungberg, Nick Pope,
and Mariusz Felisiak for reviews.
Diffstat (limited to 'django/db/models/sql/compiler.py')
-rw-r--r-- | django/db/models/sql/compiler.py | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py index 928ab40254..d405a203ee 100644 --- a/django/db/models/sql/compiler.py +++ b/django/db/models/sql/compiler.py @@ -1387,7 +1387,9 @@ class SQLInsertCompiler(SQLCompiler): # going to be column names (so we can avoid the extra overhead). qn = self.connection.ops.quote_name opts = self.query.get_meta() - insert_statement = self.connection.ops.insert_statement(ignore_conflicts=self.query.ignore_conflicts) + insert_statement = self.connection.ops.insert_statement( + on_conflict=self.query.on_conflict, + ) result = ['%s %s' % (insert_statement, qn(opts.db_table))] fields = self.query.fields or [opts.pk] result.append('(%s)' % ', '.join(qn(f.column) for f in fields)) @@ -1410,8 +1412,11 @@ class SQLInsertCompiler(SQLCompiler): placeholder_rows, param_rows = self.assemble_as_sql(fields, value_rows) - ignore_conflicts_suffix_sql = self.connection.ops.ignore_conflicts_suffix_sql( - ignore_conflicts=self.query.ignore_conflicts + on_conflict_suffix_sql = self.connection.ops.on_conflict_suffix_sql( + fields, + self.query.on_conflict, + self.query.update_fields, + self.query.unique_fields, ) if self.returning_fields and self.connection.features.can_return_columns_from_insert: if self.connection.features.can_return_rows_from_bulk_insert: @@ -1420,8 +1425,8 @@ class SQLInsertCompiler(SQLCompiler): else: result.append("VALUES (%s)" % ", ".join(placeholder_rows[0])) params = [param_rows[0]] - if ignore_conflicts_suffix_sql: - result.append(ignore_conflicts_suffix_sql) + if on_conflict_suffix_sql: + result.append(on_conflict_suffix_sql) # Skip empty r_sql to allow subclasses to customize behavior for # 3rd party backends. Refs #19096. r_sql, self.returning_params = self.connection.ops.return_insert_columns(self.returning_fields) @@ -1432,12 +1437,12 @@ class SQLInsertCompiler(SQLCompiler): if can_bulk: result.append(self.connection.ops.bulk_insert_sql(fields, placeholder_rows)) - if ignore_conflicts_suffix_sql: - result.append(ignore_conflicts_suffix_sql) + if on_conflict_suffix_sql: + result.append(on_conflict_suffix_sql) return [(" ".join(result), tuple(p for ps in param_rows for p in ps))] else: - if ignore_conflicts_suffix_sql: - result.append(ignore_conflicts_suffix_sql) + if on_conflict_suffix_sql: + result.append(on_conflict_suffix_sql) return [ (" ".join(result + ["VALUES (%s)" % ", ".join(p)]), vals) for p, vals in zip(placeholder_rows, param_rows) |