Skip to content

target_session_attrs=prefer-standby not handled correctly #1021

Description

@AndrewJackson2020

It seems that target_session_attrs=prefer-standby is not handled by psycopg. I believe a patch similar to the below (or something better) would be needed in order to make it work.

References:

diff --git a/psycopg/psycopg/connection.py b/psycopg/psycopg/connection.py
index d7035e27..c5f8a3c1 100644
--- a/psycopg/psycopg/connection.py
+++ b/psycopg/psycopg/connection.py
@@ -94,7 +94,19 @@ class Connection(BaseConnection[Row]):
         params = cls._get_connection_params(conninfo, **kwargs)
         timeout = timeout_from_conninfo(params)
         rv = None
-        attempts = conninfo_attempts(params)
+
+        if "target_session_attrs" in params and params["target_session_attrs"] == "prefer-standby":
+          params_standby = dict(params)
+          params_primary = dict(params)
+
+          params_standby["target_session_attrs"] = "standby"
+          params_primary["target_session_attrs"] = "primary"
+
+          attempts = conninfo_attempts(params_standby)
+          attempts.extend(conninfo_attempts(params_primary))
+        else:
+          attempts = conninfo_attempts(params)
+
         for attempt in attempts:
             try:
                 conninfo = make_conninfo("", **attempt)
diff --git a/psycopg/psycopg/connection_async.py b/psycopg/psycopg/connection_async.py
index 94a8bf3c..4fa8ba6e 100644
--- a/psycopg/psycopg/connection_async.py
+++ b/psycopg/psycopg/connection_async.py
@@ -110,7 +110,19 @@ class AsyncConnection(BaseConnection[Row]):
         params = await cls._get_connection_params(conninfo, **kwargs)
         timeout = timeout_from_conninfo(params)
         rv = None
-        attempts = await conninfo_attempts_async(params)
+
+        if "target_session_attrs" in params and params["target_session_attrs"] == "prefer-standby":
+          params_standby = dict(params)
+          params_primary = dict(params)
+
+          params_standby["target_session_attrs"] = "standby"
+          params_primary["target_session_attrs"] = "primary"
+
+          attempts = await conninfo_attempts_async(params_standby)
+          attempts.extend(await conninfo_attempts_async(params_primary))
+        else:
+          attempts = await conninfo_attempts_async(params)
+
         for attempt in attempts:
             try:
                 conninfo = make_conninfo("", **attempt)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions