@@ -12,33 +12,25 @@ def normalize_database_url_for_async(url: str) -> str:
1212 if u .startswith ("postgresql://" ) and not u .startswith ("postgresql+" ):
1313 u = "postgresql+asyncpg://" + u [len ("postgresql://" ) :]
1414
15- # asyncpg does not accept sslmode=..., convert psycopg-style URLs.
15+ # SQLAlchemy's asyncpg dialect forwards URL query params as kwargs to
16+ # asyncpg's connect(). asyncpg.connect() accepts `ssl` but not `sslmode`,
17+ # so rename sslmode→ssl while keeping the value as a valid SSLMode string
18+ # (disable, allow, prefer, require, verify-ca, verify-full).
1619 if u .startswith ("postgresql+asyncpg://" ):
1720 parsed = urlsplit (u )
1821 query = parse_qsl (parsed .query , keep_blank_values = True )
19- has_ssl = any (key == "ssl" for key , _ in query )
20- if not has_ssl :
21- normalized_query : list [tuple [str , str ]] = []
22- for key , value in query :
23- if key != "sslmode" :
24- normalized_query .append ((key , value ))
25- continue
26-
27- mode = value .strip ().lower ()
28- if mode == "disable" :
29- normalized_query .append (("ssl" , "false" ))
30- else :
31- normalized_query .append (("ssl" , "true" ))
32-
33- u = urlunsplit (
34- (
35- parsed .scheme ,
36- parsed .netloc ,
37- parsed .path ,
38- urlencode (normalized_query , doseq = True ),
39- parsed .fragment ,
40- )
41- )
22+ if any (key == "sslmode" for key , _ in query ):
23+ query = [
24+ ("ssl" , value ) if key == "sslmode" else (key , value )
25+ for key , value in query
26+ ]
27+ u = urlunsplit ((
28+ parsed .scheme ,
29+ parsed .netloc ,
30+ parsed .path ,
31+ urlencode (query , doseq = True ),
32+ parsed .fragment ,
33+ ))
4234 return u
4335
4436
0 commit comments