将 Liquibase 引入现有项目和 MySQL
Liquibase introduction into an existing project and MySQL
我们有一个现有的 Java 项目,它建立在 MySQL 数据库之上,我们依赖 MySQL 特定的设置和迁移机制来处理我们的 ~ 100 个表和 ~ 10意见。我们不使用存储过程。
我们实现了自定义 Java 代码(甚至具有 getRuntime().exec(…) )将它们粘合在一起,并使用各种 Ant-Targets 来调用数据库功能。
有利于减少数据库依赖和维护与我们的核心业务逻辑无关的代码。我们目前正在评估 liquibase 以简化数据库部署和迁移。
因此我们下载了 liquibase 版本 3.2.2 并使用“generateChangeLog”命令为我们当前的数据库模式创建了一个变更日志文件。
现在生成的变更日志文件遇到了一些问题:
无法将生成的 changelog.xml 文件部署到创建它的 MySQL 数据库中,因为 liquibase 生成“DOUBLE(22)”而不是安装 SQL 中的普通“DOUBLE”关键字。通过在 liquibase JIRA 上查找它并进行一些谷歌搜索,这似乎是 liquibase 中一个相当奇怪和古老的问题,但很容易修复,但目前仍未解决。
将生成的变更日志文件部署到 H2 数据库中会引发另一个问题:liquibase 生成的主键语句不适合 H2 数据库。
现在有一些关于这种方法的问题:
我们预计数据库独立性是 liquibase 的主要目标之一,但事实似乎并非如此。有没有其他人遇到过类似的问题?
从现有数据库生成的变更日志文件开始是否有些奇怪而不是预期用途?那么从手动更新日志文件开始是不是更合适的方法呢?
命令(在另一个post这里提到)是处理发现的MySQL/H2相关问题的合适方法吗?
在上述场景中,对于将 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>
我们有一个现有的 Java 项目,它建立在 MySQL 数据库之上,我们依赖 MySQL 特定的设置和迁移机制来处理我们的 ~ 100 个表和 ~ 10意见。我们不使用存储过程。
我们实现了自定义 Java 代码(甚至具有 getRuntime().exec(…) )将它们粘合在一起,并使用各种 Ant-Targets 来调用数据库功能。 有利于减少数据库依赖和维护与我们的核心业务逻辑无关的代码。我们目前正在评估 liquibase 以简化数据库部署和迁移。
因此我们下载了 liquibase 版本 3.2.2 并使用“generateChangeLog”命令为我们当前的数据库模式创建了一个变更日志文件。
现在生成的变更日志文件遇到了一些问题:
无法将生成的 changelog.xml 文件部署到创建它的 MySQL 数据库中,因为 liquibase 生成“DOUBLE(22)”而不是安装 SQL 中的普通“DOUBLE”关键字。通过在 liquibase JIRA 上查找它并进行一些谷歌搜索,这似乎是 liquibase 中一个相当奇怪和古老的问题,但很容易修复,但目前仍未解决。
将生成的变更日志文件部署到 H2 数据库中会引发另一个问题:liquibase 生成的主键语句不适合 H2 数据库。
现在有一些关于这种方法的问题:
我们预计数据库独立性是 liquibase 的主要目标之一,但事实似乎并非如此。有没有其他人遇到过类似的问题?
从现有数据库生成的变更日志文件开始是否有些奇怪而不是预期用途?那么从手动更新日志文件开始是不是更合适的方法呢?
命令(在另一个post这里提到)是处理发现的MySQL/H2相关问题的合适方法吗?
在上述场景中,对于将 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>