Docker部署PostgreSQL后Go测试报pq: role "sumka"不存在如何解决
报错pq: role "sumka" does not exist为PostgreSQL标准角色不存在错误,因DBeaver可正常连接,优先按以下顺序排查Go测试和DBeaver的连接差异:
确认测试实际加载的连接串是否正确
很多时候测试代码读取的配置不是你预设的连接串,先在testQueries初始化位置打印实际使用的数据库连接地址,确认是否和你给出的postgresql://sumka:secret@0.0.0.0:5432/simple_bank?sslmode=disable一致,排查是否误连到本地非Docker部署的PostgreSQL实例、或者Docker端口映射配置错误。验证Docker内PostgreSQL的角色配置
执行命令进入PostgreSQL容器:docker exec -it 你的PostgreSQL容器名称 psql -U postgres
执行SQL查询所有已存在的角色:SELECT rolname FROM pg_roles;
如果查询结果中没有sumka,执行以下语句创建角色并分配权限:CREATE ROLE sumka WITH LOGIN PASSWORD 'secret'; ALTER ROLE sumka CREATEDB; -- 测试如果需要创建临时库必须添加该权限 GRANT ALL PRIVILEGES ON DATABASE simple_bank TO sumka; -- 切换到simple_bank库分配表和序列权限 \c simple_bank GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO sumka; GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO sumka;另外注意PostgreSQL的角色名如果创建时加了双引号会区分大小写,如果你之前执行过
CREATE ROLE "Sumka"这类语句,小写的sumka连接时就会报不存在。排查容器启动配置是否错误
如果你通过docker run或者docker-compose启动PostgreSQL容器,检查启动时的环境变量配置,示例正确配置如下:# docker-compose.yaml 配置参考 services: postgres: image: postgres:14-alpine environment: - POSTGRES_USER=sumka - POSTGRES_PASSWORD=secret - POSTGRES_DB=simple_bank ports: - "5432:5432"容器首次启动时只会创建
POSTGRES_USER指定的默认角色,如果你配置的默认用户不是sumka,就不会自动生成该角色。排查跨容器连接问题
如果你的Go测试是运行在另一个Docker容器内,连接串填0.0.0.0会指向Go容器本身而不是宿主的PostgreSQL容器,需要把连接地址改为Docker内网地址、或者宿主机器的局域网IP。
内容的提问来源于stack exchange,提问作者suumii chiko

