mysql - Liquibase介绍现有项目和MySQL

标签 mysql h2 liquibase

我们有一个现有的 Java 项目,它构建在 MySQL 数据库之上,并且我们依赖于 MySQL 特定的设置和迁移机制来存储约 100 个表和约 10 个 View 。我们不使用存储过程。

我们实现了自定义 Java 代码(甚至具有 getRuntime().exec(…) )将其全部粘合在一起,并使用各种 Ant-Targets 来调用数据库功能。 有利于减少数据库依赖性和维护与我们的核心业务逻辑无关的代码。我们目前正在评估 liquibase 以简化数据库部署和迁移。

因此,我们下载了 liquibase 版本 3.2.2 并使用“generateChangeLog”命令为我们当前的数据库架构创建变更日志文件。

现在我们在生成的变更日志文件方面遇到了一些问题:

  1. 无法将生成的changelog.xml文件部署到创建该文件的MySQL数据库中,因为liquibase在安装SQL中生成“DOUBLE(22)”而不是普通的“DOUBLE”关键字。通过在 liquibase JIRA 上查找并进行一些谷歌搜索,这似乎是 liquibase 中一个相当奇怪且古老的问题,但很容易修复,但目前仍未解决。

  2. 将生成的变更日志文件部署到 H2 数据库中会引发另一个问题:liquibase 生成的主键语句的某些内容不适合 H2 数据库。

现在关于这种方法的一些问题:

  1. 我们预计数据库独立性是 liquibase 的主要目标之一,但事实似乎并非如此。还有其他人遇到过类似的问题吗?

  2. 从现有数据库生成的变更日志文件开始是否有点奇怪,而不是预期的用途?那么从手动更改日志文件开始会是更合适的方法吗?

  3. 该命令(在另一篇文章中提到)是处理发现的 MySQL/H2 相关问题的适当方法吗?

  4. 在上述场景中,您是否还有将 liquibase 集成到现有项目中的进一步最佳实践或资源?

非常感谢您的建议,提前致谢!

亲切的问候,

史蒂文

最佳答案

liquibase 文档说明了它如何支持跨数据库的一小组通用列类型。

http://www.liquibase.org/documentation/column.html

To help make scripts database-independent, the following “generic” data types will be converted to the correct database implementation:

BOOLEAN
CURRENCY
UUID
CLOB
BLOB
DATE
DATETIME
TIME
BIGINT

Also, specifying a java.sql.Types.* type will be converted to the correct type as well. If needed, precision can be included. Here are some examples:

java.sql.Types.TIMESTAMP
java.sql.Types.VARCHAR(255)

要支持特定的数据类型,最好的方法是在变更日志中声明数据库特定的属性。

http://www.liquibase.org/documentation/changelog_parameters.html

<property name="double.type" value="DOUBLE"     dbms="h2"/>
<property name="double.type" value="DOUBLE(22)" dbms="mysql"/>

<changeSet id="1" author="joe">
     <createTable tableName="${table.name}">
         <column name="id" type="int"/>
         <column name="val1" type="${double.type}"/>
         <column name="val2" type="${double.type}"/>
     </createTable>
</changeSet>

关于mysql - Liquibase介绍现有项目和MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28941512/

相关文章:

java - 在 MYSQL 中使用 liquibase 删除外键(如果存在)

gradle - 在 gradle 中为 liquibase 更新任务设置自定义 .properties 文件

mysql - 统计MYSQL中的查询结果

mysql - 映射到MySql BIGINT的Ecto或Elixir数据类型

java - 即使我使用 DB_CLOSE_DELAY=-1,H2 内存数据库也会报告找不到表

spring-boot - Spring Boot 2.0.4 - H2 数据库 - @SpringBootTest - 因 : org. h2.jdbc.JdbcSQLException 导致失败:未找到架构 "classpath:db/schema.sql"

java - 从 Erlang 代码连接到 H2 DB

php - SQL查询只返回第一行

mysql - gem 安装 : Failed to build gem native extension (can't find header files)

Maven liquibase 插件