2014-09-02 166 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