如何从Java程序将SQL脚本提供给psql?

时间:2016-04-27 09:36:50

标签: java postgresql psql

我需要将一个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,它就会正常工作。

我错过了什么?

0 个答案:

没有答案