將 .sql 文件從 java 重新載入到 PostgreSQL - Windows
我正在嘗試
.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
。理想情況下,每個應用程序-數據庫對都應該有自己的使用者(或數據庫術語中的角色)。