2525
2626from sqlalchemy import types as sqltypes
2727from sqlalchemy .engine import default , reflection
28+ from sqlalchemy .exc import SQLAlchemyError
2829from sqlalchemy .sql import functions
2930from sqlalchemy .util import asbool , to_list
3031
3536)
3637from .sa_version import SA_1_4 , SA_2_0 , SA_VERSION
3738from .type import FloatVector , ObjectArray , ObjectType
39+ from .util import SSLMode
3840
3941TYPES_MAP = {
4042 "boolean" : sqltypes .Boolean ,
@@ -228,8 +230,7 @@ def connect(self, host=None, port=None, *args, **kwargs):
228230 server = kwargs .pop ("servers" )
229231 servers = to_list (server )
230232
231- # Process SSL options, old and new.
232- # TODO: Switch to the canonical default `sslmode=prefer` later.
233+ # Process legacy SSL option `ssl`.
233234 if "ssl" in kwargs :
234235 warnings .warn (
235236 "The `ssl=true` option will be deprecated, "
@@ -238,11 +239,25 @@ def connect(self, host=None, port=None, *args, **kwargs):
238239 stacklevel = 2 ,
239240 )
240241 use_ssl = asbool (kwargs .pop ("ssl" , False ))
241- sslmode = kwargs .pop ("sslmode" , "disable" )
242- if sslmode in ["allow" , "prefer" , "require" , "verify-ca" , "verify-full" ]:
243- use_ssl = True
244- if sslmode in ["allow" , "prefer" , "require" ]:
245- kwargs ["verify_ssl_cert" ] = False
242+
243+ # Process new SSL option `sslmode`.
244+ # Please consult https://www.postgresql.org/docs/18/libpq-connect.html.
245+ if "sslmode" in kwargs :
246+ try :
247+ sslmode = SSLMode .parse (kwargs .pop ("sslmode" ))
248+ except AttributeError as exc :
249+ modes = ", " .join (SSLMode .modes )
250+ raise SQLAlchemyError (
251+ "`sslmode` parameter must be one of: {}" .format (modes )
252+ ) from exc
253+ if sslmode < SSLMode .allow :
254+ use_ssl = False
255+ else :
256+ use_ssl = True
257+ if sslmode >= SSLMode .verify_ca :
258+ kwargs ["verify_ssl_cert" ] = True
259+ else :
260+ kwargs ["verify_ssl_cert" ] = False
246261
247262 if not servers :
248263 servers = [self .dbapi .http .Client .default_server .replace ("http://" , "" )]
0 commit comments