我们的客户正在使用Oracle,我们希望使用MySQL进行开发。因此我们的MySQL Scheme必须与Oracle同步。我尝试使用Liquibase,但是在应用更改集时遇到问题,因为db特定的sql和不同的列类型,如NUMBER< - > BIGINT或VARCHAR< - > VARCHAR2
我使用这些工具错了吗?如何解决这类问题?
答案 0 :(得分: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
答案 1 :(得分:6)
Liquibase将尝试转换标准类型,如&#34; varchar&#34;,&#34; int&#34;,&#34; boolean&#34;,&#34; datetime&#34;到数据库的正确数据类型。如果将列定义为type =&#34; VARCHAR(100)&#34;,则在对oracle运行时,它将使用VARCHAR2(100)生成SQL。
不幸的是,标准类型到特定于数据库的类型的映射没有记录得那么好。
或者,如果您可以坚持使用SQL标准数据类型,那么它们通常是相当跨数据库的。
当您需要强制使用特定类型时,您可以使用更改日志参数,例如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"/>