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/sqlite3/operations.py | |
| parent | ba9de2e74edb155067dc96a3369305c9ef4ba385 (diff) | |
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/sqlite3/operations.py')
| -rw-r--r-- | django/db/backends/sqlite3/operations.py | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/django/db/backends/sqlite3/operations.py b/django/db/backends/sqlite3/operations.py index 90a4241803..34a7251eea 100644 --- a/django/db/backends/sqlite3/operations.py +++ b/django/db/backends/sqlite3/operations.py @@ -8,6 +8,7 @@ from django.conf import settings from django.core.exceptions import FieldError from django.db import DatabaseError, NotSupportedError, models from django.db.backends.base.operations import BaseDatabaseOperations +from django.db.models.constants import OnConflict from django.db.models.expressions import Col from django.utils import timezone from django.utils.dateparse import parse_date, parse_datetime, parse_time @@ -370,8 +371,10 @@ class DatabaseOperations(BaseDatabaseOperations): return 'django_time_diff(%s, %s)' % (lhs_sql, rhs_sql), params return 'django_timestamp_diff(%s, %s)' % (lhs_sql, rhs_sql), params - def insert_statement(self, ignore_conflicts=False): - return 'INSERT OR IGNORE INTO' if ignore_conflicts else super().insert_statement(ignore_conflicts) + def insert_statement(self, on_conflict=None): + if on_conflict == OnConflict.IGNORE: + return 'INSERT OR IGNORE INTO' + return super().insert_statement(on_conflict=on_conflict) def return_insert_columns(self, fields): # SQLite < 3.35 doesn't support an INSERT...RETURNING statement. @@ -384,3 +387,19 @@ class DatabaseOperations(BaseDatabaseOperations): ) for field in fields ] return 'RETURNING %s' % ', '.join(columns), () + + def on_conflict_suffix_sql(self, fields, on_conflict, update_fields, unique_fields): + if ( + on_conflict == OnConflict.UPDATE and + self.connection.features.supports_update_conflicts_with_target + ): + 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, + ) |
