SQLAlchemy 多主机 IPv6 地址报 too many values to unpack
重复 host=[IPv6]:port 的连接参数可能被冒号切分成多项,故障在建连接前。分离逗号主机与端口列表,保留顺序、认证和 TLS 规则,别把它当网络不可达。
连接串写成重复的 host=[2001:db8::1]:5432&host=[2001:db8::2]:5433,create_engine() 立刻报 ValueError: too many values to unpack (expected 2),还没有真正连接 PostgreSQL。先检查是不是多主机参数中的 IPv6 字面地址。
SQLAlchemy 2.1.2 有这条具体记录,正式 2.1.6 的相关实现仍会在重复 host 形式中用冒号切分每个 token。IPv6 地址自身就含多个冒号,因此不能按普通主机名的 host:port 方法直接拆成两项。切换 psycopg 与 asyncpg,也可能仍经过同一段解析。
将主机列表与端口列表分开
已核对的另一种多主机形式把主机和端口分别放在逗号列表中,避免这条重复 token 的拆分路径:
from sqlalchemy import URL
url = URL.create(
"postgresql+psycopg",
username="app_user",
database="app",
query={
"host": "2001:db8::1,2001:db8::2",
"port": "5432,5433",
},
)
地址属于文档示例网段,须替换为实际授权的主机。口令沿用应用原有的安全注入方式,示例没有提供认证凭据。这里的 host 是查询参数中的主机列表,不是 URL authority 部分的单个 IPv6 host,因此不要再给列表中的地址附上 :port。
主机与端口按位置对应,两组数量要匹配,也不能混用重复 host 形式和独立 port 列表。已有的目标会话属性、连接超时、TLS 验证和其他查询参数应原样保留,不能只复制这段片段而丢掉生产连接策略。
解析通过不表示网络已经正常
这次异常发生在 URL 解析与驱动参数生成阶段,修改 DNS、关闭证书校验或放宽防火墙都不能修复拆分项数。解析恢复后若出现超时、认证失败或证书主机名不匹配,再沿具体错误检查。
使用 IP 地址时尤其要保留原来的 TLS 身份要求。不能为了连接成功把 verify-full 降级,或把另一台主机的证书当作当前目标;需要主机名、hostaddr 等组合时,应按实际驱动的公开规则设计。
在隔离配置中核对生成的主机与端口顺序,覆盖一台、两台以及不同端口的情况,再验证真实故障切换是否符合策略。日志不要输出完整含口令连接串。当前不能把尚在讨论的方括号解析修补写成已在所有正式版本发布。


