summaryrefslogtreecommitdiff
path: root/tests/backends/test_postgresql.py
diff options
context:
space:
mode:
authorFrançois Freitag <mail@franek.fr>2017-05-05 19:19:34 -0700
committerTim Graham <timograham@gmail.com>2017-05-06 06:59:04 -0400
commit88336fdbb5e101fa25825b737169c0d6af2faa93 (patch)
tree208e2b3cb2a8aa8cdc9f0614abb03228b8b6fb84 /tests/backends/test_postgresql.py
parent504e7782fef74cb78768092780a3476866379c21 (diff)
Fixed #28062 -- Added a setting to disable server-side cursors on PostgreSQL.
When a connection pooler is set up in transaction pooling mode, queries relying on server-side cursors fail. The DISABLE_SERVER_SIDE_CURSORS setting in DATABASES disables server-side cursors for this use case.
Diffstat (limited to 'tests/backends/test_postgresql.py')
-rw-r--r--tests/backends/test_postgresql.py28
1 files changed, 28 insertions, 0 deletions
diff --git a/tests/backends/test_postgresql.py b/tests/backends/test_postgresql.py
index 024fc1add3..f4020f4e5c 100644
--- a/tests/backends/test_postgresql.py
+++ b/tests/backends/test_postgresql.py
@@ -1,5 +1,7 @@
+import operator
import unittest
from collections import namedtuple
+from contextlib import contextmanager
from django.db import connection
from django.test import TestCase
@@ -23,6 +25,18 @@ class ServerSideCursorsPostgres(TestCase):
cursors = cursor.fetchall()
return [self.PostgresCursor._make(cursor) for cursor in cursors]
+ @contextmanager
+ def override_db_setting(self, **kwargs):
+ for setting, value in kwargs.items():
+ original_value = connection.settings_dict.get(setting)
+ if setting in connection.settings_dict:
+ self.addCleanup(operator.setitem, connection.settings_dict, setting, original_value)
+ else:
+ self.addCleanup(operator.delitem, connection.settings_dict, setting)
+
+ connection.settings_dict[setting] = kwargs[setting]
+ yield
+
def test_server_side_cursor(self):
persons = Person.objects.iterator()
next(persons) # Open a server-side cursor
@@ -52,3 +66,17 @@ class ServerSideCursorsPostgres(TestCase):
del persons
cursors = self.inspect_cursors()
self.assertEqual(len(cursors), 0)
+
+ def test_server_side_cursors_setting(self):
+ with self.override_db_setting(DISABLE_SERVER_SIDE_CURSORS=False):
+ persons = Person.objects.iterator()
+ next(persons) # Open a server-side cursor
+ cursors = self.inspect_cursors()
+ self.assertEqual(len(cursors), 1)
+ del persons # Close server-side cursor
+
+ with self.override_db_setting(DISABLE_SERVER_SIDE_CURSORS=True):
+ persons = Person.objects.iterator()
+ next(persons) # Should not open a server-side cursor
+ cursors = self.inspect_cursors()
+ self.assertEqual(len(cursors), 0)