返回SQL方言以及SQL日志

最后更新:2024-07-16 22:19:15 | 状态:未完成
SQL执行过程中,在控制台或日志文件中会生成带占位符的日志。
如果需要在执行完成后返回SQL(DQL DDL DML都可以),可以在service调用的方法中添加ConfigStore参数
在执行完成后从ConfigStore中获取执行的SQL,
因为执行的SQL可能是多条,所以会返回一个List<Run>集合,
默认情况下Run中的SQL是带占位符的,与占位值分开存储
List<Run> runs = configs.runs();
for (Run run:runs){
    System.out.println("无占位符 sql:"+run.getFinalQuery(false));
    System.out.println("有占位符 sql:"+run.getFinalQuery());
    System.out.println("占位values:"+run.getValues());
}

如果要处理全局日志,可以通过DMLister DDListner以及org.anyline.data.interceptor下的拦截器

如果只需要生成SQL,但不执行,可以调用相应的adapter.buildQueryRun/buildDeleteRun等方法 返回的Run与以上操作相同

因为adapter平时不常用,所以许多人对此不太熟悉,也可以在ConfigStore上调用execute(false)方法
然后调用service.querys/insert/save/update()时提供这个ConfigStore这样querys/insert/save/update等执行后实际SQL并没有执行,只是把生成的SQL保存到了configs.runs

 ConfigStore configs = new DefaultConfigStore().execute(false);//false表示最后实际操作数据库的一步不执行
DataSet set = service.querys(table, configs);
System.out.println(set);//因为最后一步没有执行,所以这里应该输出空集合

List<Run> runs = configs.runs();
for (Run run:runs){
	 System.out.println("无占位符 sql:"+run.getFinalQuery(false));
	 System.out.println("有占位符 sql:"+run.getFinalQuery());
	 System.out.println("占位values:"+run.getValues());
}
DDL也类似,因为DDL执行过程中有元数据的对象所以execute(false)在metadata(table/column等)上执行
Table table = service.metadata().table("sso_user"); //获取表结构
table.execute(false);//不执行SQL
service.ddl().create(table);
List<Run> runs = table.runs(); //返回创建表的DDL
String sql = run.getFinalUpdate()
从一种库(mysql)复制表结构到另一种库(pg),参考【异构数据源迁移核心部分代码Mysql到Apache Ignite|VoltDB

先从mysql数据源获取表结构,再用pg数据源保存表结构,如果只是生成PG SQL而不执行,可以在调用ddl方法前先执行table.execute(false)

Table table = ServiceProxy.service("mysql数据源key").metadata().table("SSO_USER");
table.execute(false);
ServiceProxy.service("pg数据源key").ddl().create(table);
List<Run> runs = table.runs();

//导入导出数据(量大注意分页)
DataSet set = service.querys(table);
ConfigStore configs = new DefaultConfigStore().execute(false);
service.insert(table, set, configs)
List<Run> runs = configs.runs();
//再遍历runs获取SQL
首页 最近更新 搜索 提交 回复