我們的客戶使用Oracle,我們希望使用MySQL進行開發。因此我們的MySQL方案必須與Oracle同步。我試圖用Liquibase,但我在申請,因爲該數據庫特定的SQL和不同的列類型,如NUMBER <的變更的時間內得到問題 - > VARCHAR2使用不同的DBMS與Liquibase進行數據庫遷移
我使用這些工具的錯誤 - > BIGINT或VARCHAR <?如何解決這類問題?
我們的客戶使用Oracle,我們希望使用MySQL進行開發。因此我們的MySQL方案必須與Oracle同步。我試圖用Liquibase,但我在申請,因爲該數據庫特定的SQL和不同的列類型,如NUMBER <的變更的時間內得到問題 - > VARCHAR2使用不同的DBMS與Liquibase進行數據庫遷移
我使用這些工具的錯誤 - > BIGINT或VARCHAR <?如何解決這類問題?
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"/>
最好的方法是使用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
謝謝,但我怎麼能做到這一點?如果我用liquibase更新運行我的更新日誌?我必須在每個chageSet標籤中使用dbms標籤嗎? – GedankenNebel 2014-09-29 13:26:09
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
感謝您的幫助彌敦道! – GedankenNebel 2014-09-29 18:46:20