diff options
author | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2022-12-08 05:53:18 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-12-08 05:53:18 +0100 |
commit | 95a101a690402076321331d56e67d896e8f6dfbc (patch) | |
tree | eb2ef498880cc09229fce49b26fca97d8a1e00ea /django/db/backends/sqlite3/base.py | |
parent | 0036bcdcb65874f63fff8139fe86574fa155eb26 (diff) | |
download | django-95a101a690402076321331d56e67d896e8f6dfbc.tar.gz |
Fixed #34201 -- Bumped minimum supported SQLite to 3.21.0.
Diffstat (limited to 'django/db/backends/sqlite3/base.py')
-rw-r--r-- | django/db/backends/sqlite3/base.py | 142 |
1 files changed, 46 insertions, 96 deletions
diff --git a/django/db/backends/sqlite3/base.py b/django/db/backends/sqlite3/base.py index cc46434f99..a3a382a56b 100644 --- a/django/db/backends/sqlite3/base.py +++ b/django/db/backends/sqlite3/base.py @@ -239,103 +239,53 @@ class DatabaseWrapper(BaseDatabaseWrapper): determine if rows with invalid references were entered while constraint checks were off. """ - if self.features.supports_pragma_foreign_key_check: - with self.cursor() as cursor: - if table_names is None: - violations = cursor.execute("PRAGMA foreign_key_check").fetchall() - else: - violations = chain.from_iterable( - cursor.execute( - "PRAGMA foreign_key_check(%s)" - % self.ops.quote_name(table_name) - ).fetchall() - for table_name in table_names - ) - # See https://www.sqlite.org/pragma.html#pragma_foreign_key_check - for ( - table_name, - rowid, - referenced_table_name, - foreign_key_index, - ) in violations: - foreign_key = cursor.execute( - "PRAGMA foreign_key_list(%s)" % self.ops.quote_name(table_name) - ).fetchall()[foreign_key_index] - column_name, referenced_column_name = foreign_key[3:5] - primary_key_column_name = self.introspection.get_primary_key_column( - cursor, table_name - ) - primary_key_value, bad_value = cursor.execute( - "SELECT %s, %s FROM %s WHERE rowid = %%s" - % ( - self.ops.quote_name(primary_key_column_name), - self.ops.quote_name(column_name), - self.ops.quote_name(table_name), - ), - (rowid,), - ).fetchone() - raise IntegrityError( - "The row in table '%s' with primary key '%s' has an " - "invalid foreign key: %s.%s contains a value '%s' that " - "does not have a corresponding value in %s.%s." - % ( - table_name, - primary_key_value, - table_name, - column_name, - bad_value, - referenced_table_name, - referenced_column_name, - ) - ) - else: - with self.cursor() as cursor: - if table_names is None: - table_names = self.introspection.table_names(cursor) - for table_name in table_names: - primary_key_column_name = self.introspection.get_primary_key_column( - cursor, table_name - ) - if not primary_key_column_name: - continue - relations = self.introspection.get_relations(cursor, table_name) - for column_name, ( - referenced_column_name, + with self.cursor() as cursor: + if table_names is None: + violations = cursor.execute("PRAGMA foreign_key_check").fetchall() + else: + violations = chain.from_iterable( + cursor.execute( + "PRAGMA foreign_key_check(%s)" % self.ops.quote_name(table_name) + ).fetchall() + for table_name in table_names + ) + # See https://www.sqlite.org/pragma.html#pragma_foreign_key_check + for ( + table_name, + rowid, + referenced_table_name, + foreign_key_index, + ) in violations: + foreign_key = cursor.execute( + "PRAGMA foreign_key_list(%s)" % self.ops.quote_name(table_name) + ).fetchall()[foreign_key_index] + column_name, referenced_column_name = foreign_key[3:5] + primary_key_column_name = self.introspection.get_primary_key_column( + cursor, table_name + ) + primary_key_value, bad_value = cursor.execute( + "SELECT %s, %s FROM %s WHERE rowid = %%s" + % ( + self.ops.quote_name(primary_key_column_name), + self.ops.quote_name(column_name), + self.ops.quote_name(table_name), + ), + (rowid,), + ).fetchone() + raise IntegrityError( + "The row in table '%s' with primary key '%s' has an " + "invalid foreign key: %s.%s contains a value '%s' that " + "does not have a corresponding value in %s.%s." + % ( + table_name, + primary_key_value, + table_name, + column_name, + bad_value, referenced_table_name, - ) in relations.items(): - cursor.execute( - """ - SELECT REFERRING.`%s`, REFERRING.`%s` FROM `%s` as REFERRING - LEFT JOIN `%s` as REFERRED - ON (REFERRING.`%s` = REFERRED.`%s`) - WHERE REFERRING.`%s` IS NOT NULL AND REFERRED.`%s` IS NULL - """ - % ( - primary_key_column_name, - column_name, - table_name, - referenced_table_name, - column_name, - referenced_column_name, - column_name, - referenced_column_name, - ) - ) - for bad_row in cursor.fetchall(): - raise IntegrityError( - "The row in table '%s' with primary key '%s' has an " - "invalid foreign key: %s.%s contains a value '%s' that " - "does not have a corresponding value in %s.%s." - % ( - table_name, - bad_row[0], - table_name, - column_name, - bad_row[1], - referenced_table_name, - referenced_column_name, - ) - ) + referenced_column_name, + ) + ) def is_usable(self): return True |