使用Liquibase使用不同的DBMS进行数据库迁移

Ged*_*bel 4 database database-migration liquibase

我们的客户正在使用Oracle,我们希望使用MySQL进行开发.因此我们的MySQL Scheme必须与Oracle同步.我尝试使用Liquibase,但是在应用更改集时遇到问题,因为db特定的sql和不同的列类型,如NUMBER < - > BIGINT或VARCHAR < - > VARCHAR2

我使用这些工具错了吗?如何解决这类问题?

Nat*_*and 7

Liquibase将尝试将标准类型(如“ varchar”,“ int”,“ boolean”,“ datetime”)转换为数据库的正确数据类型。如果将列定义为type =“ VARCHAR(100)”,则在针对oracle运行时,它将使用VARCHAR2(100)生成SQL。

不幸的是,标准类型到特定于数据库的类型的映射没有得到应有的记录。

或者,如果您可以坚持使用SQL标准数据类型,则它们通常是相当跨数据库的。

当您需要强制使用特定类型时,可以使用changelog参数,例如http://www.liquibase.org/documentation/changelog_parameters.html中的示例

<column name="notes" type="${clob.type}"/>

并为每个数据库定义clob.type:

<property name="clob.type" value="clob" dbms="oracle"/>
<property name="clob.type" value="longtext" dbms="mysql"/>
Run Code Online (Sandbox Code Playgroud)

  • dbms标记仅“过滤”更改集以基于目标数据库执行。这很有用,但是为了减少重复,通常最好尝试将您的changeSets尽可能地设置为跨数据库。如果仅将列定义为type =“ bigint”或type =“ varchar(10)”,那么Liquibase会将其转换为oracle上的number(38)和mysql上的bigint,以及oracle和varchar(10)上的varchar2(10) MySQL的。在这种情况下,无需使用dbms。 (2认同)

bpg*_*rgo 6

最好的方法是使用changelog参数和dbms标记.

在变更集的顶部,您可以包括:

<property name="autoIncrement" value="true" dbms="mysql"/>
<property name="autoIncrement" value="false" dbms="oracle"/>
<property name="chartype" value="VARCHAR" dbms="mysql"/>
<property name="chartype" value="VARCHAR2" dbms="oracle"/>
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样改变数据集:复制代码

<changeSet id="1" author="a">
    <createTable name="x">
        <column name="id" datatype="int" autoincrement="${autoIncrement}"/>
        <column name="name" datatype="${chartype}(255)" />
        ....
</changeSet>
<changeSet id="2" author="a" dbms="oracle">
    <createSequence name="seq_x"/>
</changeSet>
Run Code Online (Sandbox Code Playgroud)

编辑来源:http://forum.liquibase.org/topic/auto-increment-vs-sequences-using-liquibase-with-oracle-and-mysql