主要是登录的问题,一开始是使用 Process p = Runtime.getRuntime().exec( "psql -U username -d dbname -h serverhost -f scripfile.sql"); 尝试在代码中执行export PGPASSWORD=test、创建.pgpass文件、利用p.getOutputStream()对象流输入密码,但效果并不理想,之后发现了这方法,完美解决了我这边的需求,写下来做个记录。
这里利用ProcessBuilder执行psql,通过ProcessBuilder.environment().put()设置环境变量,psql登录时从PGPASSWORD环境变量读取密码,从而不弹出密码输入提示。
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
String sql = "drop table table_name1;\n" +
"INSERT INTO public.table_name2 (id, username) VALUES (DEFAULT, 'user');\n" +
"UPDATE public.table_name2 set username = 'xiaoming' where id = 1;";
Execute e = new Execute();
e.sqlExec(sql);
}