summaryrefslogtreecommitdiff
path: root/django/db/models/sql/compiler.py
diff options
context:
space:
mode:
authorsean_c_hsu <s8901489@gmail.com>2020-06-15 00:58:06 +0800
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2022-01-19 20:17:42 +0100
commit0f6946495a8ec955b471ca1baaf408ceb53d4796 (patch)
treec3d867d141074fb990d3140e02fbaa9d717e8ff2 /django/db/models/sql/compiler.py
parentba9de2e74edb155067dc96a3369305c9ef4ba385 (diff)
downloaddjango-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.py23
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)