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

Database 使用不同DBMS的Liquibase数据库迁移,database,database-migration,liquibase,Database,Database Migration,Liquibase,我们的客户正在使用Oracle,我们希望使用MySQL进行开发。因此,我们的MySQL方案必须与Oracle同步。我尝试使用Liquibase,但在应用变更集时遇到了问题,因为db特定的sql和不同的列类型,如NUMBER BIGINT或VARCHAR VARCHAR2 我用错这些工具了吗?如何解决这类问题?最好的方法是使用changelog参数和dbms标记 在变更集顶部,您可以包括: <property name="autoIncrement" value="true" dbms="m

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


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

最好的方法是使用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"/>

然后您可以有如下更改集: 复制代码

<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>

....

编辑来源:

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

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

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

当需要强制特定类型时,可以使用changelog参数,如中的示例所示

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

<property name="clob.type" value="clob" dbms="oracle"/>
<property name="clob.type" value="longtext" dbms="mysql"/>


谢谢,但我如何才能做到这一点?如果我用liquibase更新运行我的变更日志?我是否必须在每个chageSet标记中使用dbms标记?dbms标记只是“过滤”要基于目标数据库执行的变更集。这是有帮助的,但为了减少重复,通常最好尽量使变更集跨数据库。如果只将列定义为type=“bigint”或type=“varchar(10)”,Liquibase将在oracle上将其转换为数字(38),在mysql上将其转换为bigint,在oracle上将其转换为varchar2(10),在mysql上将其转换为varchar(10)。在这种情况下不需要使用dbms。谢谢你的帮助Nathan!