我有一个项目,其中包含大量创建数据库的
.sql
文件。当我们加入新员工或添加新客户时,我们会使用它。 sql 文件使用 PostgreSQL \i 命令相互调用,因此我们通常只需调用 psql
命令来运行 startup.sql
文件,它就会运行其余的所有操作。
我需要从 java 程序调用
startup.sql
文件。
我尝试使用 JDBC,但它不接受
\
字符,因此当它到达 \i
时无法执行。我以为使用 PgConnection 扩展可以让我绕过 JDBC 的限制,但它仍然失败。
PgConnection connection = (PgConnection) DriverManager.getConnection(connectionString, username, password);
connection.createStatement().execute("\\i ./db_init/startup.sql"); // fails on syntax error at or near "\"
connection.execSQLQuery("\\i ./db_init/startup.sql"); // fails on syntax error at or near "\"
我还研究过使用
Process
来运行 psql
命令行工具,但它挂起。我认为因为它请求用户的密码,但该提示没有传递回运行 java 程序的终端,所以无法输入密码。也许我可以弄清楚如何连接输入和输出,但当我研究它时,这似乎相当复杂。无论如何,我更愿意直接连接到数据库,而不是让 java 执行外部程序。
我想要做的具体事情是不可能的,因为正如@AdrianKlaver评论的那样,
\i
不是postgres服务器命令,而是专门用于psql
命令行工具的命令。因此,我要么必须自己解析并运行每个命令,递归加载 \i
引用的文件,要么找到一种方法来运行 psql
工具并为其提供密码。