summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/dialects/postgresql/_psycopg_common.py
diff options
context:
space:
mode:
authormike bayer <mike_mp@zzzcomputing.com>2022-08-02 13:49:42 +0000
committerGerrit Code Review <gerrit@ci3.zzzcomputing.com>2022-08-02 13:49:42 +0000
commit44f54bf4c0056e747dd62544911886cd43647ca0 (patch)
tree946bb23716ba0401fb73613475e6ad0d3abfc112 /lib/sqlalchemy/dialects/postgresql/_psycopg_common.py
parent7f45bcd114c797105921e06789b3753e7d8f6daa (diff)
parentddc326585a5a40d5c5e18444b14022e78751cdbb (diff)
downloadsqlalchemy-44f54bf4c0056e747dd62544911886cd43647ca0.tar.gz
Merge "repair psycopg2 (and psycopg) multiple hosts format" into main
Diffstat (limited to 'lib/sqlalchemy/dialects/postgresql/_psycopg_common.py')
-rw-r--r--lib/sqlalchemy/dialects/postgresql/_psycopg_common.py27
1 files changed, 17 insertions, 10 deletions
diff --git a/lib/sqlalchemy/dialects/postgresql/_psycopg_common.py b/lib/sqlalchemy/dialects/postgresql/_psycopg_common.py
index 8dcd36c6d..efd1dbe41 100644
--- a/lib/sqlalchemy/dialects/postgresql/_psycopg_common.py
+++ b/lib/sqlalchemy/dialects/postgresql/_psycopg_common.py
@@ -131,20 +131,27 @@ class _PGDialect_common_psycopg(PGDialect):
if "host" in url.query:
is_multihost = isinstance(url.query["host"], (list, tuple))
- if opts:
+ if opts or url.query:
+ if not opts:
+ opts = {}
if "port" in opts:
opts["port"] = int(opts["port"])
opts.update(url.query)
if is_multihost:
- opts["host"] = ",".join(url.query["host"])
- # send individual dbname, user, password, host, port
- # parameters to psycopg2.connect()
- return ([], opts)
- elif url.query:
- # any other connection arguments, pass directly
- opts.update(url.query)
- if is_multihost:
- opts["host"] = ",".join(url.query["host"])
+ hosts, ports = zip(
+ *[
+ token.split(":") if ":" in token else (token, "")
+ for token in url.query["host"]
+ ]
+ )
+ opts["host"] = ",".join(hosts)
+ if "port" in opts:
+ raise exc.ArgumentError(
+ "Can't mix 'multihost' formats together; use "
+ '"host=h1,h2,h3&port=p1,p2,p3" or '
+ '"host=h1:p1&host=h2:p2&host=h3:p3" separately'
+ )
+ opts["port"] = ",".join(ports)
return ([], opts)
else:
# no connection arguments whatsoever; psycopg2.connect()