ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Dropwizard Migrations 测试数据库维护指南:重建与同步 H2 的 `test-db.mv.db`

Dropwizard Migrations 测试数据库维护指南:重建与同步 H2 的 `test-db.mv.db` 后端Web框架【免费下载链接】dropwizardA damn simple library for building production-ready RESTful web services.项目地址https://gitcode.com/gh_mirrors/dr/dropwizard点击查看免费下载在 Dropwizard 的dropwizard-migrations模块中单元测试依赖一个预先迁移完成的 H2 文件数据库test-db.mv.db来验证db status、db dump等命令行行为当 H2 主版本升级导致存储格式变化或 Liquibase changelog 变更时这个文件以及它的 SQL 备份源文件test-db-backup.sql需要重建。本文基于 create_test_db.md 这份维护说明结合 dropwizard-migrations 模块的 pom.xml 与相关测试源码完整讲解何时需要重建、如何用 H2 的RunScript/Script工具手工重建、Maven 自动化是如何落地的以及如何验证重建结果的正确性。为什么需要一个已迁移完成的 H2 文件数据库dropwizard-migrations是对 Liquibase 的封装官方手册见 migrations.rst对外提供db migrate、db status、db dump等一系列 CLI 命令。其中一些命令如db status、db dump的正确性验证需要一个已经执行过全部 changeset的数据库作为输入而不能每次测试都从零迁移。因此模块在测试资源目录中保留了一个成品数据库文件其 SQL 备份源文件为 test-db-backup.sql。从该备份文件的内容可以看到这个数据库里恰好包含验证db status所需的全部要素Liquibase 的元数据表DATABASECHANGELOGLOCK锁定表与DATABASECHANGELOG执行记录表其中记录了migrations.xml中 3 个 changeset 的EXECUTED状态1/2/3作者db_dev对应 Liquibase 3.3.3业务表PERSONS包含一条种子数据(1, Bill Smith, billsmith.me)——这正是 migrations.xml 中 changeset1createTable persons、2addColumn email、3insert Bill Smith执行后的最终形态。测试代码通过类路径直接定位该文件DbStatusCommandTest.java 与 DbDumpCommandTest.java 都使用getClass().getResource(/test-db.mv.db)取到文件 URI再把路径去掉结尾的.mv.db拼成 H2 的 JDBC URLjdbc:h2:path交给 MigrationTestSupport.java 构建DataSourceFactory配置。也就是说只要test-db.mv.db文件本身存在且内容是迁移完成态这套测试就能工作。触发重建的条件H2 主版本升级create_test_db.md 首先指出如果 H2 发生了主版本升级major upgradetest-db.mv.db的存储格式可能发生变化旧文件可能无法被新版本的 H2 引擎正常打开此时必须重新创建一个数据库文件。一个佐证细节是备份文件首行注释-- H2 2.1.214;——当前仓库中该备份是由 H2 2.1.214 导出的而 dropwizard-dependencies/pom.xml 中实际管理的h2.version为2.4.240。备份 SQL 本身是版本无关的纯 DDL DML这正是以 SQL 备份为源、按需重建二进制文件这一维护策略成立的前提。手动重建使用 H2 的RunScript工具从 SQL 备份文件重建数据库使用 H2 自带的org.h2.tools.RunScript命令行工具。它的作用是把一个 SQL 脚本文件回放replay到一个新的或已存在的数据库上等价于从备份文件创建一个数据库java -cp path_to_h2.jar org.h2.tools.RunScript -user sa -url jdbc:h2:file:./test-db -script ./test-db-backup.sql各参数含义参数说明-cp path_to_h2.jarH2 引擎 jar 的路径当前仓库依赖版本为 2.4.240见 dropwizard-dependencies/pom.xml-user sa以sa用户连接H2 默认管理员用户备份文件中也包含SA用户的建号语句-url jdbc:h2:file:./test-db目标数据库的文件型 JDBC URL。H2 2.x 默认使用 MVStore 引擎会自动在基名后追加.mv.db后缀即生成test-db.mv.db-script ./test-db-backup.sql要回放的 SQL 备份脚本执行成功后工作目录下会生成test-db.mv.db必要时还有对应的.trace.db等辅助文件把二进制文件放入src/test/resources/即完成重建。Maven 自动化exec-maven-plugin的落地文档中说明自 Dropwizard 2.1.8 / 3.0.2 / 4.0.2 起数据库文件的重建已经通过exec-maven-plugin自动化无需手工执行上面的java命令。这一点可以直接在 dropwizard-migrations/pom.xml 中得到印证plugin groupIdorg.codehaus.mojo/groupId artifactIdexec-maven-plugin/artifactId configuration includePluginDependenciestrue/includePluginDependencies mainClassorg.h2.tools.RunScript/mainClass arguments argument-user/argument argumentsa/argument argument-url/argument argumentjdbc:h2:file:${project.basedir}/src/test/resources/test-db/argument argument-script/argument argument${project.basedir}/src/test/resources/test-db-backup.sql/argument /arguments /configuration executions execution idtest-db-creation/id phasegenerate-test-resources/phase goals goaljava/goal /goals /execution /executions dependencies dependency groupIdcom.h2database/groupId artifactIdh2/artifactId version${h2.version}/version /dependency /dependencies /plugin这段配置与文档中的手工命令一一对应mainClass同为org.h2.tools.RunScript参数同为-user sa、-url jdbc:h2:file:.../test-db、-script .../test-db-backup.sql只是把path_to_h2.jar换成了插件自带的 H2 依赖${h2.version} 2.4.240。两个关键设计值得注意绑定到generate-test-resources阶段任何触发测试资源准备的生命周期如mvn test都会先自动执行RunScript从test-db-backup.sql重建出test-db.mv.db。因此即使开发者本地没有这个二进制文件或 H2 版本切换后旧文件失效构建也能自愈。与clean阶段配合同文件下方还配置了 maven-clean-plugin 的自定义 filesetexecution id 为clean-test-db绑定initialize阶段在mvn clean时删除src/test/resources/test-db.mv.db。二者配合保证每次构建中的数据库文件都来自最新的 SQL 备份而不是残留的旧产物。Liquibase changelog 变更时如何更新test-db-backup.sql第二个维护场景是当 Liquibase 的 changelogmigrations.xml等发生变更——例如新增 changeset、调整表结构或种子数据——test-db-backup.sql所描述的迁移完成态就会过时需要同步刷新。create_test_db.md 给出的流程分两步用一个全新的干净数据库执行迁移即用更新后的 changelogmigrations.xml对空库跑一遍 Liquibase 迁移得到迁移后的数据库假设为new-migrated-db。这一步可以用dropwizard-migrations自身的db migrateCLI 完成也可以用 H2 的RunScript回放 migrations-ddl.xml 等 DDL 变更集用 H2 的Script工具导出新的备份java -cp path_to_h2.jar org.h2.tools.Script -user sa -url jdbc:h2:file:./new-migrated-db -script ./test-db-backup.sqlorg.h2.tools.Script与RunScript方向相反它把当前数据库的完整结构建表语句、主键约束和数据INSERT语句含-- N /- SELECT COUNT(*)行数注释序列化写入-script指定的文件。用新导出的内容覆盖 test-db-backup.sqlDATABASECHANGELOG表中就会记录新 changelog 的 changeset 摘要如新的 MD5SUM备份文件与 changelog 重新保持一致。验证重建结果从测试源码看迁移完成态的判定重建完成后可以用两条途径验证test-db.mv.db确实处于预期状态db status应报告已最新DbStatusCommandTest.java 的testRunOnMigratedDb测试从类路径取出test-db.mv.db对其中数据运行DbStatusCommand断言输出匹配\S is up to date。若备份文件中记录的 changeset 与 changelog 不一致比如 MD5 校验和变化状态会变为有 N 个 changeset 未执行甚至报告待回滚测试即失败。db dump应能还原出表结构与数据DbDumpCommandTest.java 对同一文件数据库执行DbDumpCommand断言导出的 Liquibase XML 中包含PUBLIC.PERSONS表ID自增主键、NAME非空、EMAIL以及Bill Smith这条插入数据。这从另一个角度确认了数据库的表结构与种子数据正确。因此一次完整的维护闭环是changelog 变更 → 空库迁移 →Script重新导出test-db-backup.sqlH2 版本变更 →RunScript从备份重建test-db.mv.db或由exec-maven-plugin自动完成→ 运行db status/db dump相关测试确认断言全部通过。相关资源索引文件说明dropwizard-migrations/src/test/resources/create_test_db.md本文对应的原始维护说明dropwizard-migrations/src/test/resources/test-db-backup.sql数据库的 SQL 备份源文件H2 2.1.214 导出dropwizard-migrations/src/test/resources/migrations.xml测试用 Liquibase changelog3 个 changesetdropwizard-migrations/pom.xmlexec-maven-plugin重建与clean清理配置dropwizard-migrations/src/test/java/io/dropwizard/migrations/DbStatusCommandTest.java验证迁移完成态的测试dropwizard-migrations/src/test/java/io/dropwizard/migrations/DbDumpCommandTest.java验证 dump 输出内容与结构的测试docs/source/manual/migrations.rstdropwizard-migrations模块的用户手册适用前提以上流程基于当前仓库Dropwizard 5.0.x 线H2 2.4.240exec-maven-plugin3.6.4的实际配置若使用其他版本的 H2 或 Liquibase命令本身不变但导出的 DDL 细节如列类型、约束命名可能略有差异重建后仍应以模块内db status/db dump测试全部通过作为最终验收标准。赞分享后端Web框架【免费下载链接】dropwizardA damn simple library for building production-ready RESTful web services.项目地址https://gitcode.com/gh_mirrors/dr/dropwizard点击查看免费下载相关推荐如何高效管理pdf2htmlEX测试用例库从创建到维护的完整指南如何高效管理pdf2htmlEX测试用例库从创建到维护的完整指南 pdf2htmlEX是一款能够将PDF文件转换为HTML格式同时保持文本和格式完整性的工具。CLI文档Dropwizard与Testcontainers集成测试数据库环境Dropwizard与Testcontainers集成测试数据库环境 你是否还在为开发环境与测试环境的数据库配置不一致而头疼本地MySQL版本与CI/CD环后端Web框架如何用 PowerToys Text Extractor 快速提取屏幕文字完整指南如何用 PowerToys Text Extractor 快速提取屏幕文字完整指南 扫描件、图片、视频里的文字想复制常规办法只有重新手打。PowerToys桌面应用开发工具上一篇uBlock Origin终极配置指南2025年高效广告拦截与跨浏览器优化方案下一篇终极指南如何用Claude实现多格式文档智能分析与可视化创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表