Skip to content

target_session_attrs=prefer-standby not handled correctly #1021

@AndrewJackson2020

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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions