You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 04:05:13