summaryrefslogtreecommitdiff
path: root/django/db/backends/sqlite3/base.py
diff options
context:
space:
mode:
authorMariusz Felisiak <felisiak.mariusz@gmail.com>2022-12-08 05:53:18 +0100
committerGitHub <noreply@github.com>2022-12-08 05:53:18 +0100
commit95a101a690402076321331d56e67d896e8f6dfbc (patch)
treeeb2ef498880cc09229fce49b26fca97d8a1e00ea /django/db/backends/sqlite3/base.py
parent0036bcdcb65874f63fff8139fe86574fa155eb26 (diff)
downloaddjango-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.py142
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