Kore Te Whakamahinga me nga Raraunga Raraunga

Kore Te Whakamahinga me nga Raraunga Raraunga

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

└── db
 └── migration
     ├── V1__init.sql
     ├── V2__Add_surname.sql
     ├── V3__Final_migration.sql
     └── V4__Remove_lastname.sql

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:

  1. ka tukuna he tauira hou o te tono putanga 2.0.0.BADe whakahōu ana i te pātengi raraunga ki v2bad
  2. i roto i te paatai v2bad tīwae last_name kua kore - kua hurihia ki surname
  3. 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
  4. 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
  5. 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:

  1. ka whakamutua e matou te tauira tono putanga 2.0.0.BAD
  2. kei te noho tonu te putunga raraunga v2bad
  3. mai i te putanga 1.0.0 kare e marama he aha tena surname, ka kite tatou i nga hapa
  4. 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:

  1. mahia he hekenga patengi raraunga ki te hanga i tetahi pou hou surname. Inaianei ko to putanga DB v2
  2. kape raraunga mai last_name в surname. Kia tupatomena he maha o enei raraunga, me whakaaro koe ki te hekenga puranga!
  3. tuhia te waehere kei hea e whakamahia ana RUA и новыйa te tawhito tīwae. Inaianei ko to putanga taupānga 2.0.0
  4. 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:

  1. ka tukuna he tauira hou o te tono putanga 2.0.0e whakahōu ana i te pātengi raraunga ki v2
  2. i tenei wa i tukatukahia etahi tono e nga tauira putanga 1.0.0
  3. 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
  4. 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.
  5. 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 (oldnew 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:

  1. hurihia to tono ki te putanga 1.0.0.
  2. 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:

  1. hurihia to tono ki te putanga 2.0.0.
  2. putanga 2.0.0 whakamahi me last_name и surname.
  3. 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:

  1. te whakatakotoranga o te putanga tono 1.0.0 с v1 aronuinga pātengi raraunga (ingoa tīwae = last_name)
  2. 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)
  3. 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
  4. 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).

ato'a

Panuihia etahi atu tuhinga i runga i ta maatau blog:

Source: will.com

Tāpiri i te kōrero