# liquibase-demo **Repository Path**: bestnewcoding_admin/liquibase-demo ## Basic Information - **Project Name**: liquibase-demo - **Description**: liquibase 与spring整合和gradle liquibase 插件使用demo项目 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2020-08-18 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## liquibase-demo 说明 ### 帮助与讨论 访问[https://www.youngboy.vip/symphony/article/1540376662639](https://www.youngboy.vip/symphony/article/1540376662639) 回帖讨论 有疑问请在 [www.youngboy.vip](https://www.youngboy.vip/symphony/post?type=5) 提问 ### 项目结构与框架 构建工具 `gradle` 数据库 `h2` 数据库访问 `spring-data-jpa` ### 使用说明 本项目使用了`lombok`,使用idea打开时请打开 `Enable annotation processing` 本demo演示了与spring整合使用和 gradle liquibase插件的使用 数据库管理地址 `http://localhost:8082/h2-console` 连接地址和用户名参考`application.yml` changelog 文件在`config/liquibase/changlog/` 下 ### 与spring整合使用 下面的配置会在spring启动的时候启动`liquibase`,`liquibase`启动后会去更新当前源的数据库, 可以通过`LqiuiabseProperties`配置`liquibase`是否执行 ``` @Bean public SpringLiquibase liquibase(DataSource dataSource, LiquibaseProperties liquibaseProperties) { // Use liquibase.integration.spring.SpringLiquibase if you don't want Liquibase to start asynchronously SpringLiquibase liquibase = new SpringLiquibase(); liquibase.setDataSource(dataSource); liquibase.setChangeLog("classpath:config/liquibase/changelog/master.xml"); liquibase.setContexts(liquibaseProperties.getContexts()); liquibase.setDefaultSchema(liquibaseProperties.getDefaultSchema()); liquibase.setDropFirst(liquibaseProperties.isDropFirst()); if (env.acceptsProfiles("liquibase")) {//如果启动的liquibase profile 就运行liquibase log.info("liquibase 启动"); liquibase.setShouldRun(true); } else { liquibase.setShouldRun(false); log.info("not run Liquibase"); } return liquibase; } ``` ### gradle插件使用 liquibase 插件配置 可以配置多个 `activities` 类似 Spring中的`profiles` (实际上`activities` 就是`task`的参数列表) 每个activities对应特定任务的参数,某些任务可以共用`activities`: 如`·prod` 适用于大多数的`task` Q: 为什么需要配置这么多个`activities` A: 每个`task`需要的参数不一样,这里只例举了常用的配置,当然你可以通过` -P ` 参数指定`activities`中各个参数的值 ``` liquibase { activities { prod { driver 'org.h2.Driver' changeLogFile 'config/liquibase/changelog/master.xml' url 'jdbc:h2:file:./build/h2db/db/liquibase;DB_CLOSE_DELAY=-1' username 'sa' password '' outputFile project.ext.generateSql baseDir "$projectDir/src/main/resources/" } dev { changeLogFile 'config/liquibase/changelog/master.xml' driver 'org.h2.Driver' url 'jdbc:h2:file:./build/h2db/db/liquibase;DB_CLOSE_DELAY=-1' username 'sa' password '' outputFile project.ext.generateSql baseDir "$projectDir/src/main/resources/" } reset { driver 'org.h2.Driver' changeLogFile "$projectDir/src/main/resources/config/liquibase/changelog/${new Date().format('yyyyMMddHHmmss')}-initial_schema.xml" url 'jdbc:h2:file:./build/h2db/db/liquibase;DB_CLOSE_DELAY=-1' username 'sa' password '' outputFile project.ext.initSql baseDir "$projectDir/src/main/resources/" } dbDoc { driver 'org.h2.Driver' changeLogFile "config/liquibase/changelog/master.xml" url 'jdbc:h2:file:./build/h2db/db/liquibase;DB_CLOSE_DELAY=-1' username 'sa' password '' outputFile project.ext.generateSql baseDir "$projectDir/src/main/resources/" } } runList = project.properties.getOrDefault("runList","prod")//默认为prod模式 mainClassName = 'vip.youngboy.liquibase.LiquibaseApp' } ``` #### prod 模式 prod环境使用 更多参考 [传送门](https://www.youngboy.vip/archives/%E4%BD%BF%E7%94%A8%20LiquiBase%20%E7%AE%A1%E7%90%86%E6%95%B0%E6%8D%AE%E5%BA%93%E5%8F%98%E6%9B%B4%20%EF%BC%88%E5%90%AB%E4%B8%8E%20Spring%20Boot%20Gradle%20Liquibase%20%E6%8F%92%E4%BB%B6%E6%95%B4%E5%90%88%E7%9A%84%20demo%EF%BC%89) 附录 #### dev 模式 dev环境使用 更多参考 [传送门](https://www.youngboy.vip/archives/%E4%BD%BF%E7%94%A8%20LiquiBase%20%E7%AE%A1%E7%90%86%E6%95%B0%E6%8D%AE%E5%BA%93%E5%8F%98%E6%9B%B4%20%EF%BC%88%E5%90%AB%E4%B8%8E%20Spring%20Boot%20Gradle%20Liquibase%20%E6%8F%92%E4%BB%B6%E6%95%B4%E5%90%88%E7%9A%84%20demo%EF%BC%89) 附录 #### reset 模式 从数据库生成changelog文件 文件命名格式为 xxx-initial_schema.xml 位置在config/liquibase/changelog/中 ``` gradlew liquibaseGenerateChangelog -PrunList=reset ``` #### dbDoc 模式 生成dbDoc文档 ``` gradlew liquibaseDbDoc -PrunList=reset ``` 更多参考 [https://www.youngboy.vip/symphony/article/1540376662639](https://www.youngboy.vip/symphony/article/1540376662639) 附录 ### liquibase-cmd.jar 说明 `liquibase-cmd.jar` 是解决`changelog`文件路径用的,因为`SpringLiquibase`使用了自己的xml文件加载器, `jhipster`生成的changlog文件在spring中能使用,而gradle插件中不能用,所以我把`SpringLiquibase`中的文件加载器搬了过来 通过指定`baseDir`来确定changelog文件的具体位置 当然你也可以使用相对位置,就不需要引`liquibase-cmd.jar`了 比如 ``` //指定 relativeToChangelogFile 为 true ``` `liquibase-cmd` 项目地址 [https://gitee.com/youngboyvip/liquibase-cmd](https://gitee.com/youngboyvip/liquibase-cmd) ### 演示命令 直接执行未执行的changeset gradlew liquibaseUpdate 根据未执行的changeset生成sql gradlew liquibaseUpdateSQL 给changeset打tag gradlew -PliquibaseCommandValue="b" liquibaseTag 检测 tag 是否存在 gradlew -PliquibaseCommandValue="a" liquibaseTagExists 回滚指定标签的sql gradlew -PliquibaseCommandValue="a" liquibaseRollbackSQL 从已有的数据库中生成changeset gradlew -PrunList=reset liquibaseGenerateChangelog ### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request