Open vchenhao opened 8 months ago
发下 DemoSQLConfig 的配置,数据库的 dbUri, dbAccount, dbPassword 等敏感信息可以改为 *** 或截屏打马赛克。 目前看 Tbl_audit_data 对应配置的默认 schema 是 sys,数据库不是 MySQL, TDengine 等以 `反引号` 包裹表名、字段名的类型
重写的 APIJSONObjectParser newSQLConfig方法,以下是关键信息:
//数据源未成功设置,则使用默认
if (!isConfig) {
logger.debug("使用默认数据源!!!!!!!");
//默认使用master数据源
DruidDataSource druidDataSource = getDruidDataSource("master");
if(druidDataSource != null){
dsUrl = druidDataSource.getUrl();
dsUserName = druidDataSource.getUsername();
dsPassword = druidDataSource.getPassword();
logger.info("url:{},用户名:{},密码:{}",dsUrl,dsUserName,dsPassword);
isConfig = true;
}
}
if(!isConfig){
logger.error(">>>>>>>>>>>>>>>>>>>>>>>>>>>> 未匹配到正确数数据源,请检查!!!!!!!!!!!!!!!");
return eagleSqlConfig;
}
int i = dsUrl.lastIndexOf("/");
int j = dsUrl.lastIndexOf("?");
String start = dsUrl.substring(0, i);
String end = dsUrl.substring(j);
String schema = dsUrl.substring(i + 1, j);
System.out.println("数据库名称:" + schema);
System.out.println("数据库地址:" + dsUrl);
eagleSqlConfig.setDb(start + end, dsUserName, dsPassword, schema,DATABASE_MYSQL);
System.out.println(eagleSqlConfig.getSchema());
return eagleSqlConfig;
获取数据源信息后,对APIJSONSQLConfig进行赋值操作。打印是正确的。如果是配置的数据源不对,主表却是正确的。交换主副表后,依旧是主表正常,生成的sql副标的确不是反引号包括的。
另外,这是config配置:
public class EagleSQLConfig extends APIJSONSQLConfig {
private String database;
private String url;
private String username;
private String password;
private String schema;
public EagleSQLConfig() {
super();
}
public EagleSQLConfig(RequestMethod method, String table) {
super(method, table);
}
@Override
public String getSchema() {
return schema;
}
public void setDb(String url, String username, String password, String schema,String database) {
this.url = url;
this.username = username;
this.password = password;
this.schema = schema;
this.database = database;
}
@JSONField(serialize = false) // 不在日志打印 账号/密码 等敏感信息
@Override
public String getDBUri() {
return url;
}
@JSONField(serialize = false) // 不在日志打印 账号/密码 等敏感信息
@Override
public String getDBAccount() {
return username;
}
@JSONField(serialize = false) // 不在日志打印 账号/密码 等敏感信息
@Override
public String getDBPassword() {
return password;
}
@JSONField(serialize = false) // 不在日志打印 账号/密码 等敏感信息
@Override
public String getSQLDatabase() {
return database;
}
设置DEFAULT_SCHEMA 默认为 db_wh_portal_xl 后,生成的sql中副表的确对了,但是别名和参数中都没有用反引号包括,查询依旧错误。
DEFAULT_SCHEMA = DATABASE_MYSQL 试试。 另外所有自定义 SQLConfig 都需要注册才能保证各处都使用同一个 class:
APIJSONApplication.DEFAULT_APIJSON_CREATOR = new APIJSONCreator<Long>() {
@Override
public SQLConfig createSQLConfig() {
return new EagleSQLConfig();
}
};
debug 了一下源码发现是重写getSQLDatabase方法的问题,在生成sql时调用了该方法,但是该方法返回了null。删除该方法即可
getSQLDatabase 的返回值是最终使用执行 SQL 的数据库类型
Description
查询条件:
响应:
生成的sql:
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 已生成 1 条 SQL execute startTime = 1706856326717 database = ; schema = db_wh_portal_xl; sql =
"sys"."Tbl_audit_data" 这里应该为db_wh_portal_xl.Tbl_audit_data才对。
请问是哪里写错了?