2014-09-02 158 views
1

我们的客户使用Oracle,我们希望使用MySQL进行开发。因此我们的MySQL方案必须与Oracle同步。我试图用Liquibase,但我在申请,因为该数据库特定的SQL和不同的列类型,如NUMBER <的变更的时间内得到问题 - > VARCHAR2使用不同的DBMS与Liquibase进行数据库迁移

我使用这些工具的错误 - > BIGINT或VARCHAR <?如何解决这类问题?

回答

3

Liquibase将试图将“varchar”,“int”,“boolean”,“datetime”等标准类型转换为corr数据库的ect数据类型。如果将一个列定义为type =“VARCHAR(100)”,那么当您针对oracle运行时,它将使用VARCHAR2(100)生成SQL。

不幸的是,标准类型到特定于数据库的类型的映射没有很好地记录下来。另外,如果你可以坚持SQL标准的数据类型,它们通常是相当跨数据库的。

当你需要强制特定类型的,你可以在http://www.liquibase.org/documentation/changelog_parameters.html

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

使用参数的changelog的例子一样,定义每个数据库clob.type:

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

谢谢,但我怎么能做到这一点?如果我用liquibase更新运行我的更新日志?我必须在每个chageSet标签​​中使用dbms标签吗? – GedankenNebel 2014-09-29 13:26:09

+1

dbms标签简单地“过滤”changeSets以基于目标数据库执行。这很有帮助,但为了减少重复,通常最好尝试将changeSets尽可能地作为跨数据库。如果你简单地将你的列定义为type =“bigint”或type =“varchar(10)”,Liquibase会将它转换为oracle上的数字(38)和mysql上的bigint,并将oracle和varchar(10)上的varchar2(10) MySQL的。在这种情况下不需要使用dbms。 – 2014-09-29 18:40:42

+0

感谢您的帮助弥敦道! – GedankenNebel 2014-09-29 18:46:20

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

然后你就可以有这样的变更: 复制代码

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

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