summaryrefslogtreecommitdiff
path: root/django/db/backends/postgresql/operations.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/backends/postgresql/operations.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/backends/postgresql/operations.py')
-rw-r--r--django/db/backends/postgresql/operations.py17
1 files changed, 15 insertions, 2 deletions
diff --git a/django/db/backends/postgresql/operations.py b/django/db/backends/postgresql/operations.py
index 399c1b24e7..762cd8d23e 100644
--- a/django/db/backends/postgresql/operations.py
+++ b/django/db/backends/postgresql/operations.py
@@ -3,6 +3,7 @@ from psycopg2.extras import Inet
from django.conf import settings
from django.db.backends.base.operations import BaseDatabaseOperations
from django.db.backends.utils import split_tzname_delta
+from django.db.models.constants import OnConflict
class DatabaseOperations(BaseDatabaseOperations):
@@ -272,5 +273,17 @@ class DatabaseOperations(BaseDatabaseOperations):
prefix += ' (%s)' % ', '.join('%s %s' % i for i in extra.items())
return prefix
- def ignore_conflicts_suffix_sql(self, ignore_conflicts=None):
- return 'ON CONFLICT DO NOTHING' if ignore_conflicts else super().ignore_conflicts_suffix_sql(ignore_conflicts)
+ def on_conflict_suffix_sql(self, fields, on_conflict, update_fields, unique_fields):
+ if on_conflict == OnConflict.IGNORE:
+ return 'ON CONFLICT DO NOTHING'
+ if on_conflict == OnConflict.UPDATE:
+ return 'ON CONFLICT(%s) DO UPDATE SET %s' % (
+ ', '.join(map(self.quote_name, unique_fields)),
+ ', '.join([
+ f'{field} = EXCLUDED.{field}'
+ for field in map(self.quote_name, update_fields)
+ ]),
+ )
+ return super().on_conflict_suffix_sql(
+ fields, on_conflict, update_fields, unique_fields,
+ )