Python连接PostgreSQL时密码含@字符(分隔符),如何解决连接失败?
解决PostgreSQL连接URL中密码含@的问题
当密码包含@这类URL特殊字符时,直接写在连接URL里会导致解析错误——因为@是URL中「用户名/密码」与「主机地址」的分隔符,密码里的@会提前截断URL,让驱动无法识别正确的主机地址。以下是两种可靠的解决方法:
方法1:对密码进行URL编码
用Python内置的urllib.parse.quote_plus方法对密码做编码处理,它会自动把所有URL保留字符外的符号转换成对应编码(比如@会转成%40),确保URL能被驱动正确解析。
示例代码:
import urllib.parse import pandas as pd import connectorx as cx # 注意:如果密码里有反斜杠,要加r前缀用原始字符串,或者写双反斜杠 password = r"~2m4\9#T3(*4p**@**KL" encoded_password = urllib.parse.quote_plus(password) postgres_url = f"postgresql://username:{encoded_password}@aaa-aaaa.s111111111111.aws-emea.aaa.com:5432/bbb" query = "select * from table1" df = cx.read_sql(postgres_url, query) df.head()
方法2:使用DSN格式连接字符串
拆分连接参数为键值对,组合成DSN(数据源名称)格式的字符串,避免直接拼接URL时的字符冲突。
示例代码:
import pandas as pd import connectorx as cx conn_params = { "user": "username", "password": r"~2m4\9#T3(*4p**@**KL", "host": "aaa-aaaa.s111111111111.aws-emea.aaa.com", "port": 5432, "dbname": "bbb" } # 构造DSN字符串 dsn = " ".join([f"{k}={v}" for k, v in conn_params.items()]) # 通过postgresql://?加DSN的方式发起连接 df = cx.read_sql(f"postgresql://?{dsn}", query) df.head()
额外提醒:如果密码包含反斜杠这类Python转义字符,必须用原始字符串(前缀加r)或者双反斜杠,防止Python解析时丢失字符。
内容的提问来源于stack exchange,提问作者Tim Dunn
相关产品推荐
相关产品推荐

