亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 mvn liquibase:diff 時如何禁用刪除表和列?

使用 mvn liquibase:diff 時如何禁用刪除表和列?

慕斯709654 2024-01-17 20:50:59
我正在設置一個發布流程,以盡可能輕松地升級我們的生產環境。為了實現數據庫方面的目標,我選擇了 liquibase。每次環境升級時:代碼交付到服務器上,mvn liquibase:diff運行以生成先前版本的變更日志mvn spring-boot:run運行以啟動應用程序并使用新的變更日志執行 liquibase,因此,從新交付的代碼實體調整數據庫。問題是,例如,如果將java 中的字段移動到其他實體,liquibase將刪除該列,而不將數據傳輸到新的字段位置。@Entity所以我的問題是,我們可以配置 liquibase 來避免列和表刪除嗎?為了能夠將數據復制到新位置,然后有效地永久刪除列(或表)?我們使用spring-boot 2.1.2和liquibase maven 插件 3.4.1。我們的數據庫是MySQL 5.7.27。我試圖找到如何導出一個中的所有數據庫創建/更改 以及另一個中的所有數據庫創建/更改。就像我們可以在這兩個之間執行,第三個專門用于將數據復制到新位置。Bu 在 liquibase 文檔中沒有找到解決方案:https://www.liquibase.org/documentation/diff.htmlchangeSetchangeLog.xml changeSetchangeLog.xmlchangeLogchangeLog為了說明我的例子:v1:@Entitypublic class Person {     private long id;     private String name;     private String phoneNumber;}成為v2 : (創建實體Phone來替換實體Person的字段phoneNumber )@Entitypublic class Person {     private long id;     private String name;     private Phone phone;}@Entitypublic class Phone {    private long id;    private String phoneNumber;    private String brand;}因此,當v2交付到服務器上并mvn liquibase:diff運行時,結果 ChangeLog 將刪除phoneNumber列并在表person中創建列phone。在不從表person傳輸數據的情況下,將phoneNumber歸檔到新表phone字段phoneNumber中。我想執行將Person.phoneNumber復制到新實體Phone.phoneNumber的 changeLog (手動編寫) 。那可能嗎 ?或者有什么技巧可以正確地做到這一點?或者也許我以不好的方式使用 liquibase 來實現這一目標?
查看完整描述

1 回答

?
森林海

TA貢獻2011條經驗 獲得超2個贊

也許我錯過了一些東西,但據我了解,這diff并不是萬能的工具,可以免除您的任何責任。

在某些情況下,您必須自己編寫變更集,我認為這就是其中之一。

既然它diff確實是一個非常強大的命令,它也有它的缺點。

理論上,差異工具還可以檢查數據庫之間的新數據、更新數據和丟失數據,但實際上這不起作用,原因有兩個:

  • 表現。隨著數據集的增長,要比較的信息量也會不斷增加,直至無法管理。

  • 更改數據。在開發過程中,測試數據通常會添加到開發數據庫中,而這些數據不應復制到其他數據庫中。此外,新數據可能會添加到測試和生產數據庫中,但不應僅僅因為開發數據庫中不存在這些數據而將其刪除。

對于你的情況,我會做這樣的事情:

  1. 創建一個新表phone

  2. 添加欄目person.phone_id

  3. 將數據從 復制person.phone_numberphone.phone_number

  4. 將數據從 復制phone.idperson.phone_id

  5. person在和之間創建外鍵約束phone

  6. 降低person.phone_number

代碼可能是這樣的:

<createTable tableName="phone">

? ? <column name="id" autoIncrement="true" type="bigserial">

? ? ? ? <constraints primaryKey="true" primaryKeyName="pk_phone"/>

? ? </column>

? ? <column name="phone_number" type="varchar(30)"/>

? ? <column name="brand" type="varchar(255)"/>

</createTable>

<addColumn tableName="person">

? ? <column name="phone_id" type="bigserial"/>

</addColumn>

<update tableName="phone">

? ? <column name="phone_number" valueComputed="(select p.phone_nubmer from person p)"/>

</update>

<comment>Assuming that person.phone_number is unique</comment>

<update tableName="person">

? ? <column name="phone_id" valueComputed="(select p.id from person p where p.phone_number = phone_number)"/>

</update>

<addForeignKeyConstraint baseTableName="person" baseColumnNames="phone_id"

? ? constraintName="person_phone_id_phone_id_fk"

? ? referencedTableName="phone" referencedColumnNames="id"/>

<dropColumn tableName="person" columnName="phone_number"/>


查看完整回答
反對 回復 2024-01-17
  • 1 回答
  • 0 關注
  • 132 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號