Windows下Go代码查询本地PostgreSQL遇ECONNREFUSED(111)错误求助
解决Go调用sql.Open无报错但执行查询触发ECONNREFUSED(111)的问题
针对Windows环境下Go使用github.com/lib/pq连接本地PostgreSQL时的这个问题,结合你已确认的前提(参数正确、pgAdmin/psql能正常连接、服务运行),可以从以下几个方向排查解决:
1. 修正连接字符串的host地址,规避IPv6解析问题
Windows下localhost可能优先解析为IPv6地址[::1],若你的PostgreSQL未配置监听IPv6,就会触发连接拒绝:
- 把连接字符串中的
host=localhost替换为host=127.0.0.1,强制使用IPv4连接 - 示例修正后的连接串:
connStr := "postgres://your_user:your_pass@127.0.0.1:5432/your_db?sslmode=disable"
2. 检查PostgreSQL的监听配置
确认PostgreSQL确实在监听IPv4地址:
- 打开PostgreSQL安装目录下的
data/postgresql.conf,找到listen_addresses配置项,确保值包含127.0.0.1或设为*(允许所有地址监听),比如:listen_addresses = '127.0.0.1,localhost' - 打开
data/pg_hba.conf,添加或确保存在允许本地IPv4连接的规则:host all all 127.0.0.1/32 scram-sha-256 - 修改后重启PostgreSQL服务生效
3. 排查Windows防火墙拦截
虽然pgAdmin和psql能正常连接,但Windows防火墙可能未允许Go程序(或IDE进程)访问5432端口:
- 临时关闭Windows Defender防火墙,测试查询是否能正常执行
- 如果恢复正常,在防火墙中添加允许规则:允许你的Go编译程序(或golang.exe、IDE进程)访问5432端口的入站/出站连接
4. 替换为兼容性更好的pgx驱动
github.com/lib/pq已进入维护状态,对新版本PostgreSQL的兼容性可能存在问题,建议替换为pgx驱动:
- 安装pgx标准库兼容包:
go get github.com/jackc/pgx/v5/stdlib - 修改代码中的驱动导入和连接逻辑:
package main import ( "database/sql" "fmt" _ "github.com/jackc/pgx/v5/stdlib" ) func main() { db, err := sql.Open("pgx", "postgres://your_user:your_pass@127.0.0.1:5432/your_db?sslmode=disable") if err != nil { fmt.Println("Open error:", err) return } defer db.Close() var count int err = db.QueryRow("SELECT COUNT(*) FROM your_table").Scan(&count) if err != nil { fmt.Println("Query error:", err) return } fmt.Println("Count:", count) }
补充验证点
用netstat -ano | findstr :5432查看端口监听状态,确认PostgreSQL进程(可通过PID匹配任务管理器)正在监听0.0.0.0:5432或127.0.0.1:5432,而非仅[::1]:5432。
内容的提问来源于stack exchange,提问作者Tzvika Avni
相关产品推荐
相关产品推荐

