Golang SQL包未使用定义参数连接Postgres报root库不存在
报错原因
pq: database "root" does not exist报错的核心原因是:连接参数中指定的数据库用户root,在本地Postgres实例中不存在。
Postgres默认安装完成后只会自动创建名为postgres的超级管理员用户,不会自动生成root用户。当连接请求携带不存在的用户名发起认证时,会触发服务端异常回退逻辑,尝试匹配和传入用户名同名的数据库,最终抛出找不到root数据库的错误,该问题和是否显式指定dbname参数无关。
修复方案
方案1:使用默认用户快速验证连通性
直接将代码中配置的连接用户替换为Postgres默认的postgres用户即可:
const ( host = "localhost" port = 5432 user = "postgres" // 替换原配置中的root password = "" dbname = "postgres" )
修改后重新编译运行程序,即可正常连接到默认的postgres数据库。
方案2:创建root用户供程序连接
如果业务逻辑必须使用root作为连接用户,按以下步骤操作即可:
- 在终端执行命令切换到系统postgres用户,登录psql控制台:
sudo -u postgres psql - 在psql控制台依次执行以下命令创建用户、配置权限:
-- 创建root超级用户 CREATE USER root WITH SUPERUSER; -- 授权root用户访问postgres库的全部权限 GRANT ALL PRIVILEGES ON DATABASE postgres TO root; -- 可选:创建root用户的默认同名数据库,避免后续未指定dbname时触发同类报错 CREATE DATABASE root OWNER root; - 输入
\q退出psql控制台,重新运行Go程序即可完成连接。
关于默认同名数据库的逻辑说明
Postgres原生连接规则为:只有当连接请求中完全没有传入dbname参数时,服务端才会默认尝试连接和登录用户名同名的数据库。只要传入的用户存在、连接字符串格式正确,显式指定的dbname参数会被优先使用,不存在指定了目标库还强制跳转至同名库的情况。
内容的提问来源于stack exchange,提问作者Corné Düring
相关产品推荐
相关产品推荐

