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

Nix-Shell环境下配置PostgreSQL启动正常但创建用户报错求助

问题根因

你的PostgreSQL服务启动时按配置将Unix套接字文件生成在/tmp目录下,但Nix源中打包的PostgreSQL客户端默认会从/run/postgresql路径查找套接字,二者路径不匹配导致客户端无法连接到运行中的服务。

解决方案

方案1:临时指定套接字路径(单次命令生效)

执行所有PostgreSQL客户端命令时,手动加-h /tmp参数指定套接字目录,比如创建用户的命令改为:

createuser -h /tmp postgres --createdb --echo

Phoenix项目的Ecto配置也可以对应修改,在config.exs的数据库配置项中添加hostname: "/tmp"即可。

方案2:全局配置环境变量(nix-shell内永久生效)

直接在shell.nix的mkShell块中添加PGHOST环境变量,所有PostgreSQL客户端会自动读取该变量作为套接字查找路径,无需修改其他配置:

mkShell {
  # 原有配置不变
  PGDATA="./.db/postgres";
  RDDATA="./.db/redis";
  PGHOST = "/tmp"; # 新增这一行
  # 原有配置不变
}

修改后重新进入nix-shell即可生效。

方案3:修改服务端套接字路径

如果希望统一使用/run/postgresql作为套接字路径,可将postgresql.conf中的unix_socket_directories配置改为'/run/postgresql',需要确保当前用户对/run/postgresql目录有读写权限。该方案需要调整系统目录权限,个人开发环境更推荐前两种方案。

额外修正

你当前的shell.nix存在两处语法错误,会导致nix-shell启动失败:

  1. buildInputs列表末尾多了一个多余的右括号)
  2. shellHook的字符串包裹符''没有闭合,需要在ERL_INCLUDE_PATH配置行后补全''

修正后的shellHook示例:

shellHook = ''
  ERL_INCLUDE_PATH="${erlangR22}/lib/erlang/usr/include";
'';

内容的提问来源于stack exchange,提问作者Abdul Mughees

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 01:18:03