我需要将一个SQL脚本提供给Postgres数据库。我正在创建一个Process
实例,以脚本路径作为参数执行psql
。代码的核心:
public static void main(final String[] args)
{
ProcessBuilder pb = new ProcessBuilder("psql", "-d base", "-U user", "-f path/new_schema.sql");
Map<String, String> env = pb.environment();
env.put("PGPASSWORD", "pass");
pb.redirectErrorStream(true);
try
{
Process p = pb.start();
InputStream stdout = p.getInputStream ();
BufferedReader reader = new BufferedReader (new InputStreamReader(stdout));
String line;
while ((line = reader.readLine ()) != null)
{
System.out.println ("Stdout: " + line);
}
}
catch (Exception ex)
{
System.out.println("Something went wrong: " + ex.getMessage());
}
}
这种方式身份验证失败并显示以下消息:
psql:致命:用户&#34;用户&#34;
的对等身份验证失败
其他用户report the same error in other contexts,显然Postgres 9.3不再使用PGPASSWORD
环境变量。
因此,我尝试使用包含以下内容的.pgpass
文件替代路线:
localhost:5432:*:user:pass
然后在启动Process
实例之前添加了一个新的环境变量:
env.put("PGPASSFILE", "/home/user/.pgpass");
仍然,我收到了&#34;身份验证失败&#34;消息。
.pgpass
文件具有正确的权限(0600
),如果我直接从shell调用psql
,它就会正常工作。
我错过了什么?