mirror of
https://github.com/django/django.git
synced 2024-12-22 17:16:24 +00:00
Fixed #24018 -- Allowed setting pragma options on SQLite.
This commit is contained in:
parent
66e47ac69a
commit
7a05b8a2fa
1
AUTHORS
1
AUTHORS
@ -6,6 +6,7 @@ people who have submitted patches, reported bugs, added translations, helped
|
|||||||
answer newbie questions, and generally made Django that much better:
|
answer newbie questions, and generally made Django that much better:
|
||||||
|
|
||||||
Aaron Cannon <cannona@fireantproductions.com>
|
Aaron Cannon <cannona@fireantproductions.com>
|
||||||
|
Aaron Linville <aaron@linville.org>
|
||||||
Aaron Swartz <http://www.aaronsw.com/>
|
Aaron Swartz <http://www.aaronsw.com/>
|
||||||
Aaron T. Myers <atmyers@gmail.com>
|
Aaron T. Myers <atmyers@gmail.com>
|
||||||
Abeer Upadhyay <ab.esquarer@gmail.com>
|
Abeer Upadhyay <ab.esquarer@gmail.com>
|
||||||
|
@ -187,6 +187,9 @@ class DatabaseWrapper(BaseDatabaseWrapper):
|
|||||||
f"{allowed_transaction_modes}, or None."
|
f"{allowed_transaction_modes}, or None."
|
||||||
)
|
)
|
||||||
self.transaction_mode = transaction_mode.upper() if transaction_mode else None
|
self.transaction_mode = transaction_mode.upper() if transaction_mode else None
|
||||||
|
|
||||||
|
init_command = kwargs.pop("init_command", "")
|
||||||
|
self.init_commands = init_command.split(";")
|
||||||
return kwargs
|
return kwargs
|
||||||
|
|
||||||
def get_database_version(self):
|
def get_database_version(self):
|
||||||
@ -201,6 +204,9 @@ class DatabaseWrapper(BaseDatabaseWrapper):
|
|||||||
# The macOS bundled SQLite defaults legacy_alter_table ON, which
|
# The macOS bundled SQLite defaults legacy_alter_table ON, which
|
||||||
# prevents atomic table renames.
|
# prevents atomic table renames.
|
||||||
conn.execute("PRAGMA legacy_alter_table = OFF")
|
conn.execute("PRAGMA legacy_alter_table = OFF")
|
||||||
|
for init_command in self.init_commands:
|
||||||
|
if init_command := init_command.strip():
|
||||||
|
conn.execute(init_command)
|
||||||
return conn
|
return conn
|
||||||
|
|
||||||
def create_cursor(self, name=None):
|
def create_cursor(self, name=None):
|
||||||
|
@ -941,6 +941,30 @@ To enable the JSON1 extension you can follow the instruction on
|
|||||||
.. _JSON1 extension: https://www.sqlite.org/json1.html
|
.. _JSON1 extension: https://www.sqlite.org/json1.html
|
||||||
.. _the wiki page: https://code.djangoproject.com/wiki/JSON1Extension
|
.. _the wiki page: https://code.djangoproject.com/wiki/JSON1Extension
|
||||||
|
|
||||||
|
.. _sqlite-init-command:
|
||||||
|
|
||||||
|
Setting pragma options
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
.. versionadded:: 5.1
|
||||||
|
|
||||||
|
`Pragma options`_ can be set upon connection by using the ``init_command`` in
|
||||||
|
the :setting:`OPTIONS` part of your database configuration in
|
||||||
|
:setting:`DATABASES`. The example below shows how to enable extra durability of
|
||||||
|
synchronous writes and change the ``cache_size``::
|
||||||
|
|
||||||
|
DATABASES = {
|
||||||
|
"default": {
|
||||||
|
"ENGINE": "django.db.backends.sqlite3",
|
||||||
|
# ...
|
||||||
|
"OPTIONS": {
|
||||||
|
"init_command": "PRAGMA synchronous=3; PRAGMA cache_size=2000;",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.. _Pragma options: https://www.sqlite.org/pragma.html
|
||||||
|
|
||||||
.. _oracle-notes:
|
.. _oracle-notes:
|
||||||
|
|
||||||
Oracle notes
|
Oracle notes
|
||||||
|
@ -146,6 +146,13 @@ CSRF
|
|||||||
|
|
||||||
* ...
|
* ...
|
||||||
|
|
||||||
|
Database backends
|
||||||
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
* ``"init_command"`` option is now supported in :setting:`OPTIONS` on SQLite
|
||||||
|
to allow specifying :ref:`pragma options <sqlite-init-command>` to set upon
|
||||||
|
connection.
|
||||||
|
|
||||||
Decorators
|
Decorators
|
||||||
~~~~~~~~~~
|
~~~~~~~~~~
|
||||||
|
|
||||||
|
@ -361,6 +361,7 @@ postfix
|
|||||||
postgis
|
postgis
|
||||||
postgres
|
postgres
|
||||||
postgresql
|
postgresql
|
||||||
|
pragma
|
||||||
pre
|
pre
|
||||||
precisions
|
precisions
|
||||||
precomputation
|
precomputation
|
||||||
|
@ -116,6 +116,29 @@ class Tests(TestCase):
|
|||||||
connection.check_database_version_supported()
|
connection.check_database_version_supported()
|
||||||
self.assertTrue(mocked_get_database_version.called)
|
self.assertTrue(mocked_get_database_version.called)
|
||||||
|
|
||||||
|
def test_init_command(self):
|
||||||
|
settings_dict = {
|
||||||
|
"default": {
|
||||||
|
"ENGINE": "django.db.backends.sqlite3",
|
||||||
|
"NAME": ":memory:",
|
||||||
|
"OPTIONS": {
|
||||||
|
"init_command": "PRAGMA synchronous=3; PRAGMA cache_size=2000;",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
connections = ConnectionHandler(settings_dict)
|
||||||
|
connections["default"].ensure_connection()
|
||||||
|
try:
|
||||||
|
with connections["default"].cursor() as cursor:
|
||||||
|
cursor.execute("PRAGMA synchronous")
|
||||||
|
value = cursor.fetchone()[0]
|
||||||
|
self.assertEqual(value, 3)
|
||||||
|
cursor.execute("PRAGMA cache_size")
|
||||||
|
value = cursor.fetchone()[0]
|
||||||
|
self.assertEqual(value, 2000)
|
||||||
|
finally:
|
||||||
|
connections["default"].close()
|
||||||
|
|
||||||
|
|
||||||
@unittest.skipUnless(connection.vendor == "sqlite", "SQLite tests")
|
@unittest.skipUnless(connection.vendor == "sqlite", "SQLite tests")
|
||||||
@isolate_apps("backends")
|
@isolate_apps("backends")
|
||||||
|
Loading…
Reference in New Issue
Block a user