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/backends/postgresql/operations.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/backends/postgresql/operations.py')
-rw-r--r-- | django/db/backends/postgresql/operations.py | 17 |
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, + ) |