将 Liquibase 引入现有项目和 MySQL

Posted

技术标签:

【中文标题】将 Liquibase 引入现有项目和 MySQL【英文标题】:Liquibase introduction into an existing project and MySQL 【发布时间】:2015-03-09 12:00:42 【问题描述】:

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

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

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

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

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

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

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

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

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

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

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

非常感谢您的建议,在此先感谢!

亲切的问候,

史蒂文

【问题讨论】:

【参考方案1】:

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

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

为了帮助脚本独立于数据库,以下“通用” 数据类型将被转换为正确的数据库实现:

BOOLEAN
CURRENCY
UUID
CLOB
BLOB
DATE
DATETIME
TIME
BIGINT

此外,指定 java.sql.Types.* 类型将被转换为 正确的类型也是如此。如果需要,可以包括精度。这里是 一些例子:

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>

【讨论】:

以上是关于将 Liquibase 引入现有项目和 MySQL的主要内容,如果未能解决你的问题,请参考以下文章

从 MySQL 中的现有表生成更改日志时,liquibase 如何处理自动递增的 PK?

如何使用 JHipster 和 Liquibase 更新现有数据库? [复制]

无法与 liquibase gradle 插件生成差异

在现有数据库上使用 liquibase

处理将 MySQL 布尔类型从 tinyint 更改为 bit 的 liquibase 升级

liquibase 从表中加载数据