Rus*_*ovs 27
只要您不介意依赖Ant,就可以自己从Java执行SQL脚本而无需自己阅读.在我看来,这种依赖在你的情况下非常合理.以下是示例代码,其中SQLExec类位于ant.jar中:
private void executeSql(String sqlFilePath) {
final class SqlExecuter extends SQLExec {
public SqlExecuter() {
Project project = new Project();
project.init();
setProject(project);
setTaskType("sql");
setTaskName("sql");
}
}
SqlExecuter executer = new SqlExecuter();
executer.setSrc(new File(sqlFilePath));
executer.setDriver(args.getDriver());
executer.setPassword(args.getPwd());
executer.setUserid(args.getUser());
executer.setUrl(args.getUrl());
executer.execute();
}
Run Code Online (Sandbox Code Playgroud)
Pab*_*ruz 20
没有可移植的方法.您可以执行本机客户端作为外部程序来执行此操作:
import java.io.*;
public class CmdExec {
public static void main(String argv[]) {
try {
String line;
Process p = Runtime.getRuntime().exec
("psql -U username -d dbname -h serverhost -f scripfile.sql");
BufferedReader input =
new BufferedReader
(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
System.out.println(line);
}
input.close();
}
catch (Exception err) {
err.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
不,您必须读取文件,将其拆分为单独的查询,然后单独执行(或使用JDBC的批处理API).
其中一个原因是每个数据库都定义了自己分离SQL语句的方式(一些使用;
,另一些/
,一些允许两者甚至定义自己的分隔符).
Flyway库确实非常适合:
Flyway flyway = new Flyway();
flyway.setDataSource(dbConfig.getUrl(), dbConfig.getUsername(), dbConfig.getPassword());
flyway.setLocations("classpath:db/scripts");
flyway.clean();
flyway.migrate();
Run Code Online (Sandbox Code Playgroud)
这将扫描脚本的位置并按顺序运行它们。可以使用V01__name.sql对脚本进行版本控制,因此,如果仅调用迁移,则仅运行尚未运行的脚本。使用称为“ schema_version”的表来跟踪事物。但是也可以做其他事情,请参阅docs:flyway。
清理调用不是必需的,但对于从清理数据库开始很有用。另外,请注意位置(默认为“ classpath:db / migration”),在':'后面没有空格,这会引起我的注意。
归档时间: |
|
查看次数: |
109170 次 |
最近记录: |