Ka whakamāramahia e tenei tuhinga nga korero me pehea te whakatau i nga take hototahi papaarangi i roto i te whakatakotoranga. Ka korerotia e matou ki a koe nga mea ka pa ki o tono whakangao mena ka ngana koe ki te tuku me te kore e whakarite tuatahi. Ka haere tatou i roto i nga waahanga o te ora o te tono e tika ana kia kore he wa heke (āhua. ara: atu - kore wa heke). Ko te hua o a maatau mahi ko te tono i te huringa patengi raraunga whakamuri-hotokore i roto i te tikanga whakamuri-hototahi.
Mena kei te hiahia koe ki te mohio ki nga tauira waehere mai i te tuhinga, ka kitea e koe i GitHub.
Whakataki
Kore tukunga wa heke
He aha te mea ngaro te tukunga wa ngaro? Ka taea e koe te kii koinei te wa e tukuna ana to tono kia taea ai e koe te whakauru angitu i tetahi putanga hou o te tono ki te whakaputa, i te mea kaore te kaiwhakamahi e kite i te kore e waatea. Mai i te tirohanga a te kaiwhakamahi me te kamupene, koinei te ahuatanga tukunga pai rawa atu na te mea ka taea e ia te whakauru i nga ahuatanga hou me te whakatika i nga pepeha me te kore e pakaru.
Me pehea te whakatutuki i tenei? He maha nga huarahi, koinei tetahi o enei:
horahia te putanga Nama 1 o to ratonga
mahia he hekenga raraunga
Hoatuhia te putanga #2 o to ratonga kia rite ki te putanga #1
ka kite koe i te putanga Nama 2 e mahi ana, tangohia te putanga Nama 1
mahi!
He ngawari, ehara? Kia aroha mai, ehara i te mea ngawari noa, a ka ata tirohia e tatou a muri ake nei. Inaianei ka tirohia e tatou tetahi atu tikanga tuku noa - blue green deployment.
Kua rongo ano koe mo te horahanga puru matomato? Ko Cloud Foundry he tino ngawari tenei. Titiro noa tenei tuhinga, i reira ka whakaahuahia e matou tenei i roto i nga korero taipitopito. Hei whakarāpopoto poto, me whakamahara koe ki a koe me pehea e mahi ai i te whakatakotoranga puru matomato:
whakarite kia rua nga kape o to waehere whakaputa (“puru” me “matomato”) e mahi ana;
tika nga waka katoa ki te taiao kahurangi, ara. kia tohu ai nga URL whakangao ki reira;
tohatoha me te whakamatautau i nga huringa tono katoa i roto i te taiao matomato;
whakawhiti url mai i te kikorangi ki te taiao matomato
Ko te whakatakotoranga puru matomato he huarahi e taea ai e koe te whakauru ngawari i nga ahuatanga hou me te kore e awangawanga mo te pakaru o te whakaputa. Ko tenei na te mea ahakoa ka pa mai tetahi mea, ka taea e koe te hoki ki te taiao o mua ma te "pii i te pana."
I muri i te panui i nga korero katoa i runga ake nei, ka patai pea koe i te patai: He aha te hononga o te waatea kore ki te whakatakotoranga puru matomato?
Ae, he maha nga mea e rite ana, na te mea ko te pupuri i nga kape e rua o te taiao kotahi e hiahia ana kia rua nga kaha ki te pupuri. Koinei te take i kii ai etahi kapa Matini Fowler, whai i te rereketanga o tenei huarahi:
Ko tetahi atu whiringa ko te whakamahi i te putunga korero kotahi, te hanga i nga huringa puru-matomato mo te paetukutuku me nga paparanga rohe. I roto i tenei huarahi, he maha nga wa ka raru te papaaarangi, ina koa ka hiahia koe ki te whakarereke i tana aronuinga hei tautoko i tetahi putanga hou o te rorohiko.
Na konei ka tae mai ki te raru nui o tenei tuhinga. Pātengi Raraunga. Me titiro ano tatou ki tenei rerenga korero.
mahi i te hekenga pātengi raraunga.
Inaianei me patai koe ki a koe ano - ka pehea mena kaore i te hototahi whakamuri te huringa patengi raraunga? E kore e pakaru taku putanga tuatahi o te taupānga? Inaa, koinei tonu te mea ka tupu...
Na, ahakoa te nui o nga painga o te kore o te wa heke / te tuku puru matomato, ka whai nga kamupene ki te whai i nga tikanga haumaru e whai ake nei mo te tuku i a raatau tono:
whakarerihia he kete me te putanga hou o te tono
katia he tono e rere ana
whakahaere i nga tuhinga hei nuku i te patengi raraunga
tohatoha me te whakarewa i tetahi putanga hou o te tono
I roto i tenei tuhinga, ka korerohia e matou me pehea e mahi ai koe me to papaunga raraunga me to waehere kia pai ai te tukunga kore wa.
Ngā take pātengi raraunga
Mena kei a koe he tono whenua kore e pupuri i nga raraunga i roto i te paataka raraunga, ka taea e koe te toronga kore-kore i tenei wa tonu. Kia aroha mai, me penapena raraunga te nuinga o nga rorohiko ki tetahi waahi. Koinei te take me whakaaro rua koe i mua i te whakarereketanga o te ara iahiko. I mua i te urunga atu ki nga korero me pehea te whakarereke i te aronuinga kia taea ai te tuku wa-kore, me aro tuatahi ki te aronuinga whakaputa.
Kaupapa Whakaputa
I tenei tuhinga ka whakamahia e matou Rererangi hei taputapu mana putanga (āhua. Whakamaoritanga: kei te korero matou mo nga hekenga raraunga). Ko te tikanga, ka tuhia ano e matou he tono Spring Boot kua hanga-i roto i te tautoko Flyway me te mahi i te heke aronuinga i te wa e whakarite ana i te horopaki tono. I a koe e whakamahi ana i a Flyway, ka taea e koe te penapena tuhinga hekenga ki to kōpaki kaupapa (ma te taunoa i roto classpath:db/migration). I konei ka kite koe i tetahi tauira o nga konae heke
I roto i tenei tauira ka kite tatou i nga tuhinga hekenga e 4, mena kaore i mahia i mua, ka mahia tetahi i muri i tetahi ka timata te tono. Me titiro ki tetahi o nga konae (V1__init.sql) hei tauira.
CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);
insert into PERSON (first_name, last_name) values ('Dave', 'Syer');
Ko nga mea katoa he tino whakamarama-whaiaro: ka taea e koe te whakamahi i te SQL ki te tautuhi me pehea te whakarereke i to papaunga raraunga. Mo etahi atu korero mo te Spring Boot me te Flyway, tirohia Ko nga Puka Puka Puka.
Ma te whakamahi i tetahi taputapu mana puna me te Spring Boot, ka whiwhi koe i nga painga nui e 2:
ka wehe koe i nga huringa raraunga mai i nga huringa waehere
Ka puta te hekenga raraunga me te whakaputanga o to tono, ara. kua whakangwarihia to tikanga tuku
Raparongoā raruraru pātengi raraunga
I te waahanga e whai ake nei o te tuhinga, ka aro tatou ki te titiro ki nga huarahi e rua ki te whakarereke i nga raraunga.
te hototahi whakamuri
hototahi whakamuri
Ko te mea tuatahi ka kiia he whakatupato kia kaua koe e mahi i te tukunga kore-kore me te kore e whakarite tuatahi... Ko te tuarua e tuku ana he otinga mo te pehea e taea ai e koe te mahi i te tukunga me te kore he wa heke me te wa ano ka mau tonu te hototahi whakamuri.
Ko ta matou kaupapa ka mahia e matou he tono mo te Spring Boot Flyway ngawari Person с first_name и last_name i roto i te pātengi raraunga (āhua. whakamaoritanga: Person he tepu me te first_name и last_name - ko nga mara enei kei roto). E hiahia ana matou ki te whakaingoa ano last_name в surname.
Nga whakapae
I mua i te urunga ki roto i nga korero, e rua nga whakaaro e tika ana kia mahia mo o maatau tono. Ko te hua matua e hiahia ana matou ki te whakatutuki he tikanga ngawari noa.
Te tuhipoka. Pakihi PRO-TIP. Ma te whakangawari o nga mahi ka taea e koe te penapena moni nui mo te tautoko (te nui ake o nga tangata e mahi ana koe mo to kamupene, ka nui ake te moni ka taea e koe te penapena)!
Kaore he take ki te huri whakamuri i te patengi raraunga
Ma tenei ka whakangwari ake i te mahi tuku (kare e taea e etahi whakamuri raraunga, penei i te whakakorenga whakamuri). He pai ake ta maatau ki te huri whakamuri i nga tono anake. Ma tenei ara, ahakoa he rereke to papaunga raraunga (hei tauira, SQL me NoSQL), ka rite te ahua o to paipa tuku.
Me taea tonu te huri whakamuri i te tono kotahi putanga ki muri (kaore atu)
Me mahi te hurihanga ina tika anake. Mena he bug kei roto i te putanga o naianei kaore i te ngawari te whakatika, me hoki ano tatou ki te putanga mahi hou. Ki ta matou whakaaro ko tenei putanga mahi hou ko te mea o mua. Ko te pupuri i te hototahitanga o te waehere me te patengi raraunga mo te neke atu i te kotahi ka tino uaua me te utu nui.
Te tuhipoka. Kia pai ake te panui, i roto i tenei tuhinga ka huri tatou i te putanga nui o te tono.
Hipanga 1: State Tuatahi
Putanga taupānga: 1.0.0
Putanga DB: v1
kōrero
Koinei te ahua tuatahi o te tono.
Nga huringa raraunga
DB kei roto last_name.
CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);
insert into PERSON (first_name, last_name) values ('Dave', 'Syer');
Nga huringa waehere
Ka penapenahia e te tono nga raraunga Tangata ki roto last_name:
/*
* Copyright 2012-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package sample.flyway;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Person {
@Id
@GeneratedValue
private Long id;
private String firstName;
private String lastName;
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return this.lastName;
}
public void setLastName(String lastname) {
this.lastName = lastname;
}
@Override
public String toString() {
return "Person [firstName=" + this.firstName + ", lastName=" + this.lastName
+ "]";
}
}
Whakamuri whakaingoa tīwae hotokore
Me titiro ki tetahi tauira me pehea te whakarereke i te ingoa tīwae:
Whakarongo. Ko te tauira e whai ake nei ka pakaru noa nga mea. Ka whakaatuhia e matou tenei hei whakaatu i te raru o te hototahitanga papaa raraunga.
Putanga taupānga: 2.0.0.BAD
Putanga DB: v2bad
kōrero
KORE nga huringa o naianei e tuku kia rua nga waahanga (tawhito me te hou) i te wa kotahi. No reira, he uaua ki te whakatutuki i te tukunga kore wa heke (mehemea ka whakaarohia nga whakaaro, kaore e taea).
Te whakamatautau A/B
Ko te ahuatanga o naianei he putanga tono kei a matou 1.0.0, ka tohatohahia ki te hanga, me te papaa raraunga v1. Me tuku he tauira tuarua o te tono, te putanga 2.0.0.BAD, me te whakahōu i te pātengi raraunga ki v2bad.
Hipanga:
ka tukuna he tauira hou o te tono putanga 2.0.0.BADe whakahōu ana i te pātengi raraunga ki v2bad
i roto i te paatai v2bad tīwae last_name kua kore - kua hurihia ki surname
I angitu te whakamohoatanga raraunga me te tono, a kei te haere etahi wa 1.0.0, etahi atu - in 2.0.0.BAD. Ko nga mea katoa e hono ana ki te paataka raraunga v2bad
nga wa katoa o te putanga 1.0.0 ka timata te whiu hapa na te mea ka ngana ratou ki te whakauru raraunga ki te pou last_namekua kore e noho
nga wa katoa o te putanga 2.0.0.BAD ka mahi kaore he raruraru
Ka kite koe, mena ka huri whakamuri i nga huringa hotokore ki te paataka korero me te tono, kaore e taea te whakamatautau A/B.
Whakahoki tono
Me whakaaro tatou i muri i te ngana ki te mahi A/B deployment (āhua. per.: Ko te tikanga o te kaituhi ko te whakamatautau A/B i konei) i whakatau matou me huri whakamuri te tono ki te putanga 1.0.0. Me kii kaore matou e hiahia ki te huri whakamuri i te paataka raraunga.
Hipanga:
ka whakamutua e matou te tauira tono putanga 2.0.0.BAD
kei te noho tonu te putunga raraunga v2bad
mai i te putanga 1.0.0 kare e marama he aha tena surname, ka kite tatou i nga hapa
kua pakaru te reinga, e kore e taea te hoki ano
Kei te kite koe, mena ka huri whakamuri nga huringa hotokore ki te paataka raraunga me te tono, kaore e taea te hoki ki te putanga o mua.
Rangitaki mahi tuhinga
Backward incompatible scenario:
01) Run 1.0.0
02) Wait for the app (1.0.0) to boot
03) Generate a person by calling POST localhost:9991/person to version 1.0.0
04) Run 2.0.0.BAD
05) Wait for the app (2.0.0.BAD) to boot
06) Generate a person by calling POST localhost:9991/person to version 1.0.0 <-- this should fail
07) Generate a person by calling POST localhost:9992/person to version 2.0.0.BAD <-- this should pass
Starting app in version 1.0.0
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:
{"firstName":"b73f639f-e176-4463-bf26-1135aace2f57","lastName":"b73f639f-e176-4463-bf26-1135aace2f57"}
Starting app in version 2.0.0.BAD
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:
curl: (22) The requested URL returned error: 500 Internal Server Error
Generate a person in version 2.0.0.BAD
Sending a post to 127.0.0.1:9995/person. This is the response:
{"firstName":"e156be2e-06b6-4730-9c43-6e14cfcda125","surname":"e156be2e-06b6-4730-9c43-6e14cfcda125"}
Nga huringa raraunga
Hōtuhi heke e whakaingoa ana last_name в surname
Kuputuhi Rererere Puna:
CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);
insert into PERSON (first_name, last_name) values ('Dave', 'Syer');
Hōtuhi e whakaingoa ana last_name.
-- This change is backward incompatible - you can't do A/B testing
ALTER TABLE PERSON CHANGE last_name surname VARCHAR;
Nga huringa waehere
Kua hurihia e matou te ingoa mara lastName i runga i surname.
Te whakaingoa ano i tetahi pou i roto i te huarahi whakamuri-hototahi
Koinei te tino ahuatanga ka pa ki a tatou. Me huri whakamuri nga huringa hotokore. Kua whakamatauhia e matou mo te tukunga-kore-kore, kaua e tono noa i te hekenga patengi raraunga kaore he waahanga taapiri. I roto i tenei waahanga o te tuhinga, ka mahia e matou e 3 nga whakatakotoranga o te tono me nga hekenga patengi raraunga ki te whakatutuki i te hua e hiahiatia ana me te pupuri i te hototahi whakamuri.
Te tuhipoka. Kia maumahara kei a matou he papaunga raraunga putanga v1. He pou kei roto first_name и last_name. Me huri tatou last_name i runga i surname. Kei a matou ano te putanga taupānga 1.0.0, kaore ano kia whakamahia surname.
Hipanga 2: Tāpiri ingoa ingoa
Putanga taupānga: 2.0.0
Putanga DB: v2
kōrero
Ma te taapiri i tetahi pou hou me te kape i ona ihirangi, ka hangaia e matou nga huringa papaa raraunga whakamuri. I taua wa ano, mena ka huri tatou i te JAR, kei te rere ranei he JAR tawhito, e kore e pakaru i te wa e mahia ana.
Kei te whakaputahia e matou he putanga hou
Hipanga:
mahia he hekenga patengi raraunga ki te hanga i tetahi pou hou surname. Inaianei ko to putanga DB v2
kape raraunga mai last_name в surname. Kia tupatomena he maha o enei raraunga, me whakaaro koe ki te hekenga puranga!
tuhia te waehere kei hea e whakamahia ana RUA и новыйa te tawhito tīwae. Inaianei ko to putanga taupānga 2.0.0
panui te uara mai i te pou surname, ki te kahore null, mai i last_nameki te surname kaore i tohua. Ka taea e koe te muku getLastName() mai i te waehere, na te mea ka puta null ina huri whakamuri i to tono mai 3.0.0 ki 2.0.0.
Mena kei te whakamahi koe i te Spring Boot Flyway, ka mahia enei mahi e rua i te wa o te whakaohotanga putanga 2.0.0 tono. Mēnā ka whakahaere ā-ringatia e koe te taputapu whakaputa pātengi raraunga, me mahi koe kia rua ngā mahi hei mahi i tēnei (tuatahi whakahōu ā-ringatia te putanga db kātahi ka horahia te tono hōu).
He mea nui. Kia mahara ko te tīwae hou i hangaia KAUA hei KORE NULU. Mena ka hoki whakamuri koe, kaore te tono tawhito e mohio mo te pou hou, kare hoki e whakauru i te waa Insert. Engari ki te taapirihia e koe tenei herenga ka waiho to db v2, me whakarite te uara o te pou hou. Ka arai ki te takahi i nga here.
He mea nui. Me tango e koe te tikanga getLastName(), no te mea i roto i te putanga 3.0.0 Karekau he ariā o te tīwae i roto i te waehere last_name. Ko te tikanga ka whakatauhia te null ki reira. Ka taea e koe te waiho i te tikanga me te taapiri i nga haki mo null, engari ko te otinga pai ake ko te whakarite i roto i te arorau getSurname() i tohua e koe te uara kore-kore tika.
Te whakamatautau A/B
Ko te ahuatanga o naianei he putanga tono kei a matou 1.0.0, ka tukuna ki te whakaputanga, me te papaunga raraunga i roto v1. Me tuku he tauira tuarua o te tono putanga 2.0.0ka whakahōu te pātengi raraunga ki v2.
Hipanga:
ka tukuna he tauira hou o te tono putanga 2.0.0e whakahōu ana i te pātengi raraunga ki v2
i tenei wa i tukatukahia etahi tono e nga tauira putanga 1.0.0
i angitu te whakahou me te maha o nga waahanga whakahaere o te tono putanga 1.0.0 me etahi atu putanga 2.0.0. Ka whakawhitiwhiti korero nga tangata katoa me te papaa raraunga i roto v2
putanga 1.0.0 e kore e whakamahi i te tīwae ingoa i roto i te pātengi raraunga, engari te putanga 2.0.0 whakamahi. E kore ratou e pokanoa tetahi ki tetahi, a kia kore he he.
putanga 2.0.0 ka rokiroki raraunga i roto i te tīwae tawhito me te tīwae hōu, e whakarite ana i te hototahi whakamuri
He mea nui. Mena kei a koe etahi patai e tatau ana i nga mea i runga i nga uara mai i te pou tawhito/hou, me mahara koe kei a koe nga uara taarua (te ahua kei te heke tonu). Hei tauira, ki te hiahia koe ki te tatau i te maha o nga kaiwhakamahi o ratou ingoa whakamutunga (ahakoa te ingoa o te pou) i timata ki te reta A, kia oti ra ano te hekenga raraunga (old → new tīwae) kei a koe he raraunga koretake mena ka patai koe i tetahi pou hou.
Whakahoki tono
Inaianei kei a maatau te putanga taupānga 2.0.0 me te pātengi raraunga i roto v2.
Hipanga:
hurihia to tono ki te putanga 1.0.0.
putanga 1.0.0 kāore e whakamahi tīwae i te pātengi raraunga surname, no reira me angitu te hurihanga
Nga huringa DB
He tīwae kei roto i te pātengi raraunga last_name.
Rererangi puna tuhi:
CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);
insert into PERSON (first_name, last_name) values ('Dave', 'Syer');
Tāpiri hōtuhi surname.
Whakarongo. Kia maumahara KORE e taea e koe te taapiri i nga here NOT NULL ki te pou e taapiri ana koe. Mena ka hurihia e koe te JAR, karekau te putanga tawhito e mohio mo te pou taapiri ka tautuhi aunoa ki te NULL. Mena he herenga pera, ka pakaru noa te tono tawhito.
-- NOTE: This field can't have the NOT NULL constraint cause if you rollback, the old version won't know about this field
-- and will always set it to NULL
ALTER TABLE PERSON ADD surname varchar(255);
-- WE'RE ASSUMING THAT IT'S A FAST MIGRATION - OTHERWISE WE WOULD HAVE TO MIGRATE IN BATCHES
UPDATE PERSON SET PERSON.surname = PERSON.last_name
Nga huringa waehere
Ka rokiroki matou i nga raraunga hei last_nameTuhinga o mua surname. I te wa ano ka panui tatou mai i last_name, i te mea ko tenei pou te mea tino whaitake. I te wa o te tukunga, kua tukuna etahi tono e tetahi tauira tono kaore ano kia whakahōuhia.
/*
* Copyright 2012-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package sample.flyway;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Person {
@Id
@GeneratedValue
private Long id;
private String firstName;
private String lastName;
private String surname;
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
/**
* Reading from the new column if it's set. If not the from the old one.
*
* When migrating from version 1.0.0 -> 2.0.0 this can lead to a possibility that some data in
* the surname column is not up to date (during the migration process lastName could have been updated).
* In this case one can run yet another migration script after all applications have been deployed in the
* new version to ensure that the surname field is updated.
*
* However it makes sense since when looking at the migration from 2.0.0 -> 3.0.0. In 3.0.0 we no longer
* have a notion of lastName at all - so we don't update that column. If we rollback from 3.0.0 -> 2.0.0 if we
* would be reading from lastName, then we would have very old data (since not a single datum was inserted
* to lastName in version 3.0.0).
*/
public String getSurname() {
return this.surname != null ? this.surname : this.lastName;
}
/**
* Storing both FIRST_NAME and SURNAME entries
*/
public void setSurname(String surname) {
this.lastName = surname;
this.surname = surname;
}
@Override
public String toString() {
return "Person [firstName=" + this.firstName + ", lastName=" + this.lastName + ", surname=" + this.surname
+ "]";
}
}
Hipanga 3: Tango last_name i te waehere
Putanga taupānga: 3.0.0
Putanga DB:v3
kōrero
Tuhipoka per.: Ko te ahua, i roto i te tuhinga taketake i pohehe te kaituhi i nga tuhinga o tenei poraka mai i te taahiraa 2. I tenei taahiraa, me whakarereke i roto i te waehere tono e whai ana ki te tango i nga mahi e whakamahi ana i te pou. last_name.
Na roto i te taapiri i tetahi pou hou me te kape i ona ihirangi, i hangaia e matou nga huringa papaa raraunga whakamuri. Ano hoki, ki te huri tatou i te JAR, ka rere ranei he JAR tawhito, kare e pakaru i te wa e mahia ana.
Whakahoki tono
I tenei wa kei a maatau te putanga taupānga 3.0.0 me te pātengi raraunga v3. Putanga 3.0.0 e kore e tiaki raraunga ki last_name. Ko te tikanga kei roto surname kei te rongoa nga korero hou rawa atu.
Hipanga:
hurihia to tono ki te putanga 2.0.0.
putanga 2.0.0 whakamahi me last_name и surname.
putanga 2.0.0 ka tango surname, ki te kore e kore, ki te kore -last_name
Nga huringa raraunga
Karekau he huringa hanganga i roto i te putunga raraunga. Ko te tuhinga e whai ake nei ka mahia hei mahi i te hekenga whakamutunga o nga raraunga tawhito:
-- WE'RE ASSUMING THAT IT'S A FAST MIGRATION - OTHERWISE WE WOULD HAVE TO MIGRATE IN BATCHES
-- ALSO WE'RE NOT CHECKING IF WE'RE NOT OVERRIDING EXISTING ENTRIES. WE WOULD HAVE TO COMPARE
-- ENTRY VERSIONS TO ENSURE THAT IF THERE IS ALREADY AN ENTRY WITH A HIGHER VERSION NUMBER
-- WE WILL NOT OVERRIDE IT.
UPDATE PERSON SET PERSON.surname = PERSON.last_name;
-- DROPPING THE NOT NULL CONSTRAINT; OTHERWISE YOU WILL TRY TO INSERT NULL VALUE OF THE LAST_NAME
-- WITH A NOT_NULL CONSTRAINT.
ALTER TABLE PERSON MODIFY COLUMN last_name varchar(255) NULL DEFAULT NULL;
Nga huringa waehere
Tuhipoka per.: Ko te whakaahuatanga o tenei poraka i pohehehia ano e te kaituhi mai i te taahiraa 2. I runga i te arorau o te tuhinga, ko nga huringa i roto i te waehere i tenei taahiraa me whai ki te tango i nga waahanga e mahi ana me te pou. last_name.
Ka rokiroki matou i nga raraunga hei last_nameTuhinga o mua surname. I tua atu, ka panui tatou mai i te pou last_name, i te mea ko te mea tino whaitake. I te wa o te tukunga, ka tukuna etahi tono ma tetahi tauira kaore ano kia whakamohoa ake.
/*
* Copyright 2012-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package sample.flyway;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Person {
@Id
@GeneratedValue
private Long id;
private String firstName;
private String surname;
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getSurname() {
return this.surname;
}
public void setSurname(String lastname) {
this.surname = lastname;
}
@Override
public String toString() {
return "Person [firstName=" + this.firstName + ", surname=" + this.surname
+ "]";
}
}
Hipanga 4: Tango last_name i te pātengi raraunga
Putanga taupānga: 4.0.0
Putanga DB: v4
kōrero
Na te mea ko te waehere putanga 3.0.0 kihai i whakamahi i te pou last_name, karekau he kino e puta i te wa o te whakamatenga mena ka hoki ano tatou ki 3.0.0 i muri i te tango i tetahi pou mai i te papaarangi.
Rangitaki mahi tuhinga
We will do it in the following way:
01) Run 1.0.0
02) Wait for the app (1.0.0) to boot
03) Generate a person by calling POST localhost:9991/person to version 1.0.0
04) Run 2.0.0
05) Wait for the app (2.0.0) to boot
06) Generate a person by calling POST localhost:9991/person to version 1.0.0
07) Generate a person by calling POST localhost:9992/person to version 2.0.0
08) Kill app (1.0.0)
09) Run 3.0.0
10) Wait for the app (3.0.0) to boot
11) Generate a person by calling POST localhost:9992/person to version 2.0.0
12) Generate a person by calling POST localhost:9993/person to version 3.0.0
13) Kill app (3.0.0)
14) Run 4.0.0
15) Wait for the app (4.0.0) to boot
16) Generate a person by calling POST localhost:9993/person to version 3.0.0
17) Generate a person by calling POST localhost:9994/person to version 4.0.0
Starting app in version 1.0.0
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:
{"firstName":"52b6e125-4a5c-429b-a47a-ef18bbc639d2","lastName":"52b6e125-4a5c-429b-a47a-ef18bbc639d2"}
Starting app in version 2.0.0
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:
{"firstName":"e41ee756-4fa7-4737-b832-e28827a00deb","lastName":"e41ee756-4fa7-4737-b832-e28827a00deb"}
Generate a person in version 2.0.0
Sending a post to 127.0.0.1:9992/person. This is the response:
{"firstName":"0c1240f5-649a-4bc5-8aa9-cff855f3927f","lastName":"0c1240f5-649a-4bc5-8aa9-cff855f3927f","surname":"0c1240f5-649a-4bc5-8aa9-cff855f3927f"}
Killing app 1.0.0
Starting app in version 3.0.0
Generate a person in version 2.0.0
Sending a post to 127.0.0.1:9992/person. This is the response:
{"firstName":"74d84a9e-5f44-43b8-907c-148c6d26a71b","lastName":"74d84a9e-5f44-43b8-907c-148c6d26a71b","surname":"74d84a9e-5f44-43b8-907c-148c6d26a71b"}
Generate a person in version 3.0.0
Sending a post to 127.0.0.1:9993/person. This is the response:
{"firstName":"c6564dbe-9ab5-40ae-9077-8ae6668d5862","surname":"c6564dbe-9ab5-40ae-9077-8ae6668d5862"}
Killing app 2.0.0
Starting app in version 4.0.0
Generate a person in version 3.0.0
Sending a post to 127.0.0.1:9993/person. This is the response:
{"firstName":"cbe942fc-832e-45e9-a838-0fae25c10a51","surname":"cbe942fc-832e-45e9-a838-0fae25c10a51"}
Generate a person in version 4.0.0
Sending a post to 127.0.0.1:9994/person. This is the response:
{"firstName":"ff6857ce-9c41-413a-863e-358e2719bf88","surname":"ff6857ce-9c41-413a-863e-358e2719bf88"}
Nga huringa DB
Whanaunga v3 tango noa tatou i te pou last_name me te taapiri i nga here kua ngaro.
-- REMOVE THE COLUMN
ALTER TABLE PERSON DROP last_name;
-- ADD CONSTRAINTS
UPDATE PERSON SET surname='' WHERE surname IS NULL;
ALTER TABLE PERSON ALTER COLUMN surname VARCHAR NOT NULL;
Nga huringa waehere
Karekau he huringa ki te waehere.
mutunga
I tutuki pai ta matou tono i tetahi huringa whakamuri-hotokore ki te ingoa pou ma te mahi i te maha o nga tukunga whakamuri-hototahi. Kei raro nei te whakarāpopototanga o ngā mahi i mahia:
te whakatakotoranga o te putanga tono 1.0.0 с v1 aronuinga pātengi raraunga (ingoa tīwae = last_name)
te whakatakotoranga o te putanga tono 2.0.0, e penapena raraunga ki roto last_name и surname. Ka panui te tono mai i last_name. Kei te putanga te pātengi raraunga v2kei roto nga pou penei last_name, a surname. surname he kape o last_name. (FAKATOKANGA: Ko tenei tīwae me kaua he herenga kore kore)
te whakatakotoranga o te putanga tono 3.0.0, ka penapena raraunga anake ki roto surname ka panui mai i te ingoa ingoa. Mo te patengi raraunga, kei te whakahaerehia te hekenga whakamutunga last_name в surname. He here hoki KORE NULU tangohia mai last_name. Ko te papaunga raraunga kei te putanga inaianei v3
te whakatakotoranga o te putanga tono 4.0.0 - karekau he huringa ki te waehere. Te whakatakotoranga raraunga v4, e tango ana last_name. I konei ka taea e koe te taapiri i nga here kua ngaro ki te paataka raraunga.
Ma te whai i tenei huarahi, ka taea e koe te huri whakamuri i te putanga kotahi me te kore e pakaru te hototahitanga raraunga/tono.
Waehere
Ko nga waehere katoa e whakamahia ana i tenei tuhinga e waatea ana i GitHub. Kei raro nei he whakamaarama taapiri.
Kaupapa
Whai muri i te kati i te putunga, ka kite koe i te hanganga kōpaki e whai ake nei.
├── boot-flyway-v1 - 1.0.0 version of the app with v1 of the schema
├── boot-flyway-v2 - 2.0.0 version of the app with v2 of the schema (backward-compatible - app can be rolled back)
├── boot-flyway-v2-bad - 2.0.0.BAD version of the app with v2bad of the schema (backward-incompatible - app cannot be rolled back)
├── boot-flyway-v3 - 3.0.0 version of the app with v3 of the schema (app can be rolled back)
└── boot-flyway-v4 - 4.0.0 version of the app with v4 of the schema (app can be rolled back)
Nga Tuhituhi
Ka taea e koe te whakahaere i nga tuhinga e whakaahuatia ana i roto i nga tuhinga kei raro iho nei, e whakaatu ana i nga huringa whakamuri-hototahi me te hotokore ki te paataka raraunga.
Hei kite te take me nga huringa hototahi whakamuri, rere:
./scripts/scenario_backward_compatible.sh
A kia kite take me nga huringa hotokore whakamuri, rere:
./scripts/scenario_backward_incompatible.sh
Tauira Pua Puna Rererangi
Ko nga tauira katoa ka tangohia mai i Spring Boot Sample Flyway.
Ka taea e koe te titiro ki http://localhost:8080/flyway, he rarangi tuhi tuhi.
Kei roto hoki i tenei tauira te papatohu H2 (i http://localhost:8080/h2-console) kia taea e koe te tiro i te tūnga pātengi raraunga (taunoa jdbc URL ko jdbc:h2:mem:testdb).