Postgresql

將 .sql 文件從 java 重新載入到 PostgreSQL - Windows

  • November 29, 2012

我正在嘗試.sql從我的範例 Java 應用程序將腳本文件重新載入到 PostgreSQL 中。

腳本已從控制台以及 pgAdmin 工具成功執行。但是從Java,它掛起……

這是我正在使用的程式碼:

C:/Program Files/PostgreSQL/9.2/bin/psql.exe -U postgres -d sampledb -f "H:/Data/samplescript_postgres.sql" 

誰能幫我?我正在使用 PostgreSQL 9.2

Java程式碼:

String path = "H:/Data/samplescript_postgres.sql";
final String cmd = "C:/Program Files/PostgreSQL/9.2/bin/psql.exe -U postgres -d sampledb -f " + "\""+ path + "\" ";

try {
   reloadProcess = Runtime.getRuntime().exec(cmd);
   if(null!=reloadProcess){
       if(reloadProcess.waitFor()==0){
           System.out.println("Reloaded");
       }
   }
} catch (IOException e) {
   e.printStackTrace();
} catch (InterruptedException e) {
   e.printStackTrace();
}

我的 pg_hba.conf 文件:

# TYPE  DATABASE    USER    ADDRESS         METHOD  
# IPv4  local   connections:    
host    all         all     127.0.0.1/32    md5 
# IPv6  local   connections:    
host    all         all     ::1/128         md5

這可能不是做你想做的事情的最佳方式。“正確”的方法可能是通過 jdbc 執行文件中的 SQL 命令。

也就是說,離你現在的位置還有很長的路要走,我們可能會讓你想做的事情發揮作用。

可能的問題是 psql.exe 的路徑中有空格。

當您使用特定格式的 exec 時,java 使用 vanilla string tokenizer 將您的字元串拆分為一個數組,每個條目由一個空格分隔。所以它將嘗試執行命令“ c:/Program”並傳遞參數,第一個參數是“ Files/PostgreSQL/9.2/bin/psql.exe”,嗯,這不會那麼順利。

改用exec (String[])http ://docs.oracle.com/javase/6/docs/api/java/lang/Runtime.html#exec(java.lang.String$$ $$)

此方法不應用標記器,因為它接受一個數組,所以它認為它不需要。

嘗試這個:

String path = "H:/Data/samplescript_postgres.sql";
final String [] cmd = { "C:/Program Files/PostgreSQL/9.2/bin/psql.exe",
      "-U", "postgres",
      "-d", "sampledb",
      "-f", path 
    };

try {
   reloadProcess = Runtime.getRuntime().exec(cmd);
   if(null!=reloadProcess){
       if(reloadProcess.waitFor()==0){
           System.out.println("Reloaded");
       }
   }
} catch (IOException e) {
   e.printStackTrace();
} catch (InterruptedException e) {
   e.printStackTrace();
}

你可以看到我已經手動創建了數組。為了可讀性,我將選項"-U"和值"postgres"放在同一行,但它們用逗號分隔。

使用psql這種方式並不是它的開發目的,因此當它的行為與從命令行呼叫的不同時,您可能會感到驚訝。

正如 sufleR 在評論中建議的那樣,psql等待密碼是可能的。但是您沒有任何方法可以提供…因此,您必須通過在 pg_hba.conf 文件中添加一行來避免使用密碼:

local   sampledb    postgres    trust

(以 開頭的行local通常位於以host. 開頭的行之前)

如果我理解正確,這只是一個測試設置,然後就可以了。在生產應用程序中,與使用者連接到數據庫是一個壞主意postgres。理想情況下,每個應用程序-數據庫對都應該有自己的使用者(或數據庫術語中的角色)。

引用自:https://dba.stackexchange.com/questions/29335