summaryrefslogtreecommitdiff
path: root/django/db/backends/sqlite3/base.py
diff options
context:
space:
mode:
authorAnže Pečar <anze@pecar.me>2024-01-23 11:51:24 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2024-01-30 11:42:34 +0100
commita0204ac183ad6bca71707676d994d5888cf966aa (patch)
treeaf34f0226d69a68614d3246af2d0a803f2811791 /django/db/backends/sqlite3/base.py
parentae8baaee9d717cb48d59514b7130e35ae921d265 (diff)
Fixed #29280 -- Made the transactions behavior configurable on SQLite.
Diffstat (limited to 'django/db/backends/sqlite3/base.py')
-rw-r--r--django/db/backends/sqlite3/base.py21
1 files changed, 20 insertions, 1 deletions
diff --git a/django/db/backends/sqlite3/base.py b/django/db/backends/sqlite3/base.py
index 10a296c992..8e17ea3d44 100644
--- a/django/db/backends/sqlite3/base.py
+++ b/django/db/backends/sqlite3/base.py
@@ -135,6 +135,8 @@ class DatabaseWrapper(BaseDatabaseWrapper):
"iendswith": r"LIKE '%%' || UPPER({}) ESCAPE '\'",
}
+ transaction_modes = frozenset(["DEFERRED", "EXCLUSIVE", "IMMEDIATE"])
+
Database = Database
SchemaEditorClass = DatabaseSchemaEditor
# Classes instantiated in __init__().
@@ -171,6 +173,20 @@ class DatabaseWrapper(BaseDatabaseWrapper):
RuntimeWarning,
)
kwargs.update({"check_same_thread": False, "uri": True})
+ transaction_mode = kwargs.pop("transaction_mode", None)
+ if (
+ transaction_mode is not None
+ and transaction_mode.upper() not in self.transaction_modes
+ ):
+ allowed_transaction_modes = ", ".join(
+ [f"{mode!r}" for mode in sorted(self.transaction_modes)]
+ )
+ raise ImproperlyConfigured(
+ f"settings.DATABASES[{self.alias!r}]['OPTIONS']['transaction_mode'] "
+ f"is improperly configured to '{transaction_mode}'. Use one of "
+ f"{allowed_transaction_modes}, or None."
+ )
+ self.transaction_mode = transaction_mode.upper() if transaction_mode else None
return kwargs
def get_database_version(self):
@@ -298,7 +314,10 @@ class DatabaseWrapper(BaseDatabaseWrapper):
Staying in autocommit mode works around a bug of sqlite3 that breaks
savepoints when autocommit is disabled.
"""
- self.cursor().execute("BEGIN")
+ if self.transaction_mode is None:
+ self.cursor().execute("BEGIN")
+ else:
+ self.cursor().execute(f"BEGIN {self.transaction_mode}")
def is_in_memory_db(self):
return self.creation.is_in_memory_db(self.settings_dict["NAME"])