diff options
| author | Anže Pečar <anze@pecar.me> | 2024-01-23 11:51:24 +0100 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2024-01-30 11:42:34 +0100 |
| commit | a0204ac183ad6bca71707676d994d5888cf966aa (patch) | |
| tree | af34f0226d69a68614d3246af2d0a803f2811791 /django/db/backends/sqlite3/base.py | |
| parent | ae8baaee9d717cb48d59514b7130e35ae921d265 (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.py | 21 |
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"]) |
