第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

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

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

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

1 回答

?
森林海

TA貢獻(xiàn)2011條經(jīng)驗(yàn) 獲得超2個(gè)贊

也許我錯(cuò)過(guò)了一些東西,但據(jù)我了解,這diff并不是萬(wàn)能的工具,可以免除您的任何責(zé)任。

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

既然它diff確實(shí)是一個(gè)非常強(qiáng)大的命令,它也有它的缺點(diǎn)。

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

  • 表現(xiàn)。隨著數(shù)據(jù)集的增長(zhǎng),要比較的信息量也會(huì)不斷增加,直至無(wú)法管理。

  • 更改數(shù)據(jù)。在開發(fā)過(guò)程中,測(cè)試數(shù)據(jù)通常會(huì)添加到開發(fā)數(shù)據(jù)庫(kù)中,而這些數(shù)據(jù)不應(yīng)復(fù)制到其他數(shù)據(jù)庫(kù)中。此外,新數(shù)據(jù)可能會(huì)添加到測(cè)試和生產(chǎn)數(shù)據(jù)庫(kù)中,但不應(yīng)僅僅因?yàn)殚_發(fā)數(shù)據(jù)庫(kù)中不存在這些數(shù)據(jù)而將其刪除。

對(duì)于你的情況,我會(huì)做這樣的事情:

  1. 創(chuàng)建一個(gè)新表phone

  2. 添加欄目person.phone_id

  3. 將數(shù)據(jù)從 復(fù)制person.phone_numberphone.phone_number

  4. 將數(shù)據(jù)從 復(fù)制phone.idperson.phone_id

  5. person在和之間創(chuàng)建外鍵約束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"/>


查看完整回答
反對(duì) 回復(fù) 2024-01-17
  • 1 回答
  • 0 關(guān)注
  • 148 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)