From 73cbb372baa45d1fdafd571e2f430a980831f722 Mon Sep 17 00:00:00 2001 From: Anders Kaseorg Date: Thu, 6 Apr 2023 12:44:37 -0700 Subject: Fixed #34466 -- Reallowed setting cursor_factory in DATABASES["options"] on PostgreSQL. Regression in 09ffc5c1212d4ced58b708cbbf3dfbfb77b782ca. --- django/db/backends/postgresql/base.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) (limited to 'django') diff --git a/django/db/backends/postgresql/base.py b/django/db/backends/postgresql/base.py index 3db3d6abd2..5ed856448f 100644 --- a/django/db/backends/postgresql/base.py +++ b/django/db/backends/postgresql/base.py @@ -223,7 +223,13 @@ class DatabaseWrapper(BaseDatabaseWrapper): conn_params.pop("assume_role", None) conn_params.pop("isolation_level", None) - conn_params.pop("server_side_binding", None) + server_side_binding = conn_params.pop("server_side_binding", None) + conn_params.setdefault( + "cursor_factory", + ServerBindingCursor + if is_psycopg3 and server_side_binding is True + else Cursor, + ) if settings_dict["USER"]: conn_params["user"] = settings_dict["USER"] if settings_dict["PASSWORD"]: @@ -269,20 +275,13 @@ class DatabaseWrapper(BaseDatabaseWrapper): connection = self.Database.connect(**conn_params) if set_isolation_level: connection.isolation_level = self.isolation_level - if is_psycopg3: - connection.cursor_factory = ( - ServerBindingCursor - if options.get("server_side_binding") is True - else Cursor - ) - else: + if not is_psycopg3: # Register dummy loads() to avoid a round trip from psycopg2's # decode to json.dumps() to json.loads(), when using a custom # decoder in JSONField. psycopg2.extras.register_default_jsonb( conn_or_curs=connection, loads=lambda x: x ) - connection.cursor_factory = Cursor return connection def ensure_timezone(self): -- cgit v1.2.1