常见问题(FAQ)
基础使用
Q: SQL 脚本执行后,下次启动会重复执行吗?
不会。ezasse 的核心机制是条件检查,每次启动都会先执行校验逻辑(如检查表是否存在、字段是否存在),只有当校验条件不满足时,才会执行对应的 SQL 脚本。
因此,一旦 SQL 被成功执行(例如表已创建),后续每次启动校验都会通过并跳过该脚本,实现天然的幂等性。
Q: 如何临时禁用 ezasse,不让它在启动时执行?
通过配置项关闭执行开关,但保留 ezasse 的实例化(便于后续开启):
spring:
ezasse:
execute: false # 仅关闭执行,不影响 Bean 创建
如果需要完全不实例化 ezasse:
spring:
ezasse:
enable: false # 完全关闭
Q: 启动类必须添加 @EnableEzasse 注解吗?
是的,在 Spring Boot 项目中,@EnableEzasse 注解是 ezasse 自动装配的触发开关,缺少该注解则 ezasse 不会被初始化。
@SpringBootApplication
@EnableEzasse // 必须添加
public class Application { ... }
SQL 文件
Q: SQL 文件放在哪里?支持哪些目录结构?
SQL 文件默认放置在 resources/sql/ 目录下。可以通过配置项 spring.ezasse.folders 自定义多个扫描目录:
spring:
ezasse:
folders:
- sql
- db/migration
- config/scripts
ezasse 会递归扫描这些目录下的所有 .sql 文件。
Q: 文件中没有校验行时,SQL 会被执行吗?
不会。ezasse 只执行有校验行(如 -- TABLE(...) 、-- EXEC(...))守卫的 SQL 代码块。没有校验行的普通 SQL 内容会被忽略。
Q: 多个 SQL 文件的执行顺序如何控制?
通过两种方式控制:
-
使用文件命名中的顺序号(推荐):文件名格式
group-[datasource]-[order]-[other].sql,其中order为三位数字,数字小的先执行。v1.0.0-100-table.sql → 先执行
v1.0.0-200-data.sql → 后执行 -
配置
group-order:当存在多个分组(版本)时,指定分组执行顺序:spring:
ezasse:
group-order:
- v1.0.0
- v1.1.0
校验与执行
Q: 如何让一个校验行对应多条 SQL 语句?
使用限定符(-- [ 和 -- ])将多条 SQL 包裹在同一个执行块中:
spring:
ezasse:
delimiter-start: "-- ["
delimiter-end: "-- ]"
-- TABLE(t_order)
-- [
CREATE TABLE t_order ( id BIGINT PRIMARY KEY );
CREATE INDEX idx_order_id ON t_order(id);
-- ]
Q: 遇到 No checker found for checkerId: XXX 错误怎么办?
这表示 SQL 文件中使用了某个关键字,但系统未找到对应的校验器。可能原因:
- 关键字拼写错误:检查 SQL 文件中的关键字是否与配置项或自定义校验器的
getId()完全一致(大小写敏感)。 - 未引入对应模块:内置校验器(如
TABLE、ADD、EXEC)由ezasse-for-jdbc提供,请确认依赖已正确引入。 - SPI 未生效:自定义校验器若使用 SPI 注册,检查
META-INF/services/cn.com.pism.ezasse.checker.EzasseChecker文件路径和内容是否正确。
Q: 如何确认 ezasse 是否正常执行了某条 SQL?
开启 debug 日志即可看到完整的执行过程:
logging:
level:
cn.com.pism.ezasse: debug
日志会输出每条校验行的校验结果(check passed: [true/false])以及最终执行的 SQL 内容。
多数据源
Q: 多数据源时,校验和执行用的数据源可以不同吗?
可以。通过校验行语法中的双节点格式来指定:
-- 关键字.校验节点.执行节点(校验内容)
-- 在 slave 节点校验,在 master 节点执行
-- TABLE.slave.master(t_order)
CREATE TABLE t_order ( id BIGINT PRIMARY KEY );
Q: 非 Spring Boot 的普通 Java 项目如何使用 ezasse?
使用 ezasse-core + 对应的实现包(如 ezasse-for-jdbc),通过编程方式手动构建上下文并执行:
<dependency>
<groupId>cn.com.pism</groupId>
<artifactId>ezasse-for-jdbc</artifactId>
<version>${ezasse.version}</version>
</dependency>
// 构建数据源
EzasseDataSource dataSource = JdbcEzasseDataSource.of("master", "MYSQL", yourDataSource);
// 创建并配置 Ezasse 实例
FileEzasse ezasse = new FileEzasse();
ezasse.getContext().datasourceManager().registerMasterDataSource(dataSource);
ezasse.getContext().configManager().setFolders(List.of("sql"));
// 执行
ezasse.execute();
Q: 使用 Nacos 存储 SQL 脚本如何配置?
引入 ezasse-for-nacos 模块,并参考该模块的文档进行配置,ezasse 会通过扩展的资源加载器从 Nacos 拉取脚本内容,整体执行流程与本地文件模式完全一致。