แแก แกแขแแขแแ แแแขแแแฃแ แแ แแแแแแ แขแแแก, แแฃ แ แแแแ แฃแแแ แแแแแญแ แแก แแแแแชแแแแ แแแแแก แแแแกแแแแแแแแก แกแแแแแฎแแแ แแแแแแแแแแกแแก. แฉแแแ แแแขแงแแแ, แ แ แจแแแซแแแแ แแแแแแ แแแก แแฅแแแแก แกแแฌแแ แแแ แแแแแแแชแแแแก, แแฃ แจแแแชแแแแแ แแแแแแแแกแแ แฌแแแแกแฌแแ แ แแแแแแแแแแก แแแ แแจแ. แจแแแแแ แฉแแแ แแแแแแแแ แแแแแแแชแแแก แกแแกแแชแแชแฎแแ แชแแแแแก แแขแแแแแก, แ แแแแแแแช แกแแญแแ แแ แแฃแแแแแแ แจแแคแแ แฎแแแแกแแแแก (แแแแฎแ. แแแแ: แจแแแแแแแ - แแฃแแแแแแ แจแแคแแ แฎแแแแก แแ แ). แฉแแแแ แแแแ แแชแแแแแก แจแแแแแ แแฅแแแแ แแแแแชแแแแ แแแแแก แฃแแฃแจแแแแแกแแแแแ แชแแแแแแแแก แแแแแงแแแแแ แฃแแฃแฆแแ แแแแกแแแแแ แแแแ.
แแฃ แแกแฃแ แ แแแแแแ แแแแแก แแแแแแแแแแ แกแขแแขแแแแแ, แจแแแแซแแแแ แแแแแแ แแกแแแ แแฅ
แจแแกแแแแแ
แแฃแแแแแแ แจแแคแแ แฎแแแแก แแแแแแแแแ
แ แ แแแกแขแแแฃแ แแ แแฃแแแแแแ แจแแคแแ แฎแแแแก แแแแแแแแแ? แจแแแซแแแแ แแแฅแแแก, แ แแ แแก แฎแแแแ แแแจแแ, แ แแแแกแแช แแฅแแแแ แแแแแแแชแแ แแแแแแแแแฃแแแ แแกแ, แ แแ แแฅแแแ แฌแแ แแแขแแแแ แจแแซแแแแ แแแแแแแชแแแก แแฎแแแ แแแ แกแแแก แฌแแ แแแแแแจแ แฌแแ แแแแแแก, แฎแแแ แแแแฎแแแ แแแแแ แแแ แจแแแแฉแแแแก แแแก แแแฃแฌแแแแแแแแแก. แแแแฎแแแ แแแแแกแ แแ แแแแแแแแแก แแแ แกแแแฅแขแแแแแแ, แแก แแ แแก แแแแแแแแแแก แกแแฃแแแแแกแ แจแแกแแซแแ แกแชแแแแ แ, แ แแแแแ แแก แกแแจแฃแแแแแแก แแซแแแแก แแฎแแแ แคแฃแแฅแชแแแแแก แแแแแ แแแแก แแ แจแแชแแแแแแแก แแแแแกแฌแแ แแแแก แจแแคแแ แฎแแแแก แแแ แแจแ.
แ แแแแ แแแแแฆแฌแแแ แแแแก? แ แแแแแแแแ แแแ แแ แกแแแแแก, แแฅ แแ แแก แแ แแ แแแแแแแ:
- แแแแแแแแกแแ แแฅแแแแ แกแแ แแแกแแก แแแแแ แ 1 แแแ แกแแ
- แจแแแกแ แฃแแแ แแแแแชแแแแ แแแแแก แแแแ แแชแแ
- แแแแแแแแกแแ แแฅแแแแ แกแแ แแแกแแก #2 แแแ แกแแ #1 แแแ แกแแแก แแแ แแแแแฃแ แแ
- แ แแแแ แช แแ แแแแแแฎแแแ, แ แแ แแแ แกแแ No2 แแฃแจแแแแก แแกแ, แ แแแแ แช แฃแแแ, แฌแแจแแแแ แแแ แกแแ No1
- แแแแ แแ แแก!
แแแแแแแ, แแ แ? แกแแแฌแฃแฎแแ แแ, แแก แแ แช แแกแ แแแ แขแแแแ แแ แแแแก แแแขแแแฃแ แแ แแแแแแแแแแแ แแแแแแฎแแแแแ. แแฎแแ แแแแแ แจแแแแแแฌแแแ แแแแแ แแ แแ แกแแแแแแ แแแแ แชแแแแแฃแแ แแแแแแแแแแก แแ แแชแแกแ - แแฃแ แฏแ แแฌแแแแ แแแแแแแแแ.
แแกแแแแแแ แแแแกแแ
- แแแ แฌแแฃแแแแ, แ แแ แแฅแแแแ แฌแแ แแแแแแก แแแแแก แแ แ แแกแแ (โแแฃแ แฏแโ แแ โแแฌแแแแโ) แแฃแจแแแแก;
- แแแแแ แขแ แแคแแแ แแฃแ แฏ แแแ แแแแจแ, แ.แ. แแกแ, แ แแ แฌแแ แแแแแแก URL-แแแ แแแฃแแแแแแก แแฅ;
- แแแแแแแแกแแ แแ แจแแแแแฌแแแ แแแแแแแชแแแก แงแแแแ แชแแแแแแแ แแฌแแแแ แแแ แแแแจแ;
- urls-แแก แจแแชแแแ แแฃแ แฏแแแแ แแฌแแแแ แแแ แแแแแ
แแฃแ แฏแ แแฌแแแแ แแแแแแแแแ แแ แแก แแแแแแแ, แ แแแแแแช แกแแจแฃแแแแแแก แแแซแแแแ แแแ แขแแแแ แจแแแแแขแแแแ แแฎแแแ แคแฃแแฅแชแแแแ แฌแแ แแแแแแก แแแ แฆแแแแแก แจแแกแแฎแแ แคแแฅแ แแก แแแ แแจแ. แแก แแแแแฌแแแฃแแแ แแแแ, แ แแ แแแจแแแแช แแ, แแฃ แ แแแ แแแฎแแแแ, แแฅแแแ แจแแแแซแแแแ แแแ แขแแแแ แแแแแฎแแแแแ แฌแแแ แแแ แแแแจแ, แฃแแ แแแแ โแแแแแแ แแแแแแก แแแญแแ แแโ.
แงแแแแแแแ แแแแแแฆแแแจแแฃแแแก แฌแแแแแฎแแแก แจแแแแแ แจแแแซแแแแ แแแแแกแแแ แแแแฎแแ: แ แ แแแแจแแ แ แแฅแแก แแฃแแแแแแ แจแแคแแ แฎแแแแก แแ แ แแฃแ แฏ แแฌแแแแ แแแแแแแแแแก?
แแแ แแแ, แแแ แกแแแแแแ แแแแ แ แกแแแ แแ แแฅแแ, แ แแแแแ แแ แแ แแ แแแแแ แแแ แแแแก แแ แ แแกแแแก แจแแแแ แฉแฃแแแแ แแแแแฎแแแก แแ แแแ แซแแแแกแฎแแแแแก แแแ แจแแกแแแแ แฉแฃแแแแแแ. แแแแขแแแแช แแแขแแแชแแแก แแแแแแ แแ แแฃแแแ
แแแแแ แแ แแ แแแ แแแแขแแ แแแแแ แแแแแชแแแแ แแแแแก แแแแแงแแแแแ, แแฃแ แฏ-แแฌแแแแ แแแแชแแแขแ แแขแแ แแแแก แจแแฅแแแ แแแแกแ แแ แแแแแแแก แคแแแแแแกแแแแก. แแ แแแแแแแแ, แแแแแชแแแแ แแแแ แฎแจแแ แแ แจแแแซแแแแ แแงแแก แแ แแแแแแ, แแแแกแแแฃแแ แแแแ แแแจแแ, แ แแแแกแแช แแญแแ แแแแแ แแแกแ แกแฅแแแแก แจแแชแแแ แแ แแแ แแแฃแแ แฃแแ แฃแแแแแงแแคแแก แแฎแแแ แแแ แกแแแก แแฎแแ แแแกแแญแแ แแ.
แแ แแฅ แแแแแแแ แแแแแแ แแ แแแแแแแแแ แแ แกแขแแขแแแจแ. แฒแแแแชแแแแ แแแแ. แแแแแ แแแแแ แแ แแฎแแ แจแแแฎแแแแ แแ แคแ แแแแก.
แจแแแกแ แฃแแแ แแแแแชแแแแ แแแแแก แแแแ แแชแแ.
แแฎแแ แแฅแแแ แฃแแแ แแแฃแกแแแ แกแแแฃแแแ แแแแก แแแแฎแแ - แ แ แแแฎแแแแ, แแฃ แแแแแชแแแแ แแแแแก แชแแแแแแแ แแ แแ แแก แฃแแฃแแแแกแแแแแ? แแ แฌแงแแแแ แแแแแแแชแแแก แฉแแแ แแแ แแแแ แแแ แกแแ? แกแแแแแแแแแแจแ, แแก แแ แแก แแฃแกแขแแ แแก, แ แแช แแแฎแแแแ ...
แแกแ แ แแ, แแแฃแฎแแแแแแ แแฃแแแแแแ แจแแคแแ แฎแแแแก / แแฃแ แฏแ แแฌแแแแ แแแแแแแแแแก แฃแแแ แแแแแ แ แฃแแแ แแขแแกแแแแแแกแ, แแแแแแแแแแ แแแแ แแแแแแ แแ แแแ แแแแชแแแก แจแแแแแแ แฃแกแแคแ แแฎแ แแ แแชแแกแ แแแแ แแแแแแแชแแแแแก แแแแกแแแแแกแแแแแ:
- แแแแแแแแแ แแแแแขแ แแแแแแแชแแแก แแฎแแแ แแแ แกแแแ
- แแแจแแแแฃแแ แแแแแแแชแแแก แแแแแจแแ
- แแแฃแจแแแ แกแแ แแแขแแแ แแแแแชแแแแ แแแแแก แแแแ แแชแแแกแแแแก
- แแแแแแแแกแแ แแ แแแฃแจแแแ แแแแแแแชแแแก แแฎแแแ แแแ แกแแ
แแ แกแขแแขแแแจแ แฉแแแ แแแขแแแฃแ แแ แแแแแแฎแแแแแ, แแฃ แ แแแแ แจแแแแซแแแแ แแแฃแจแแแ แแฅแแแแก แแแแแชแแแแ แแแแแกแแแ แแ แแแแแแ, แ แแ แแกแแ แแแแแแ แแฃแแแแแแ แจแแคแแ แฎแแแแ.
แแแแแชแแแแ แแแแแก แกแแแแแฎแแแ
แแฃ แแฅแแแ แแแฅแแ แแแฅแแแแฅแแแแแก แแ แแฅแแแ แแแแแแแชแแ, แ แแแแแแช แแ แแแแฎแแแก แแแแแชแแแแแก แแแแแชแแแแ แแแแแจแ, แแแจแแแแ แจแแแแซแแแแ แแแแฆแแ แแฃแแแแแแ แจแแคแแ แฎแแแแก แแ แ. แกแแแฌแฃแฎแแ แแ, แแ แแแ แแแฃแแ แฃแแ แฃแแแแแงแแคแแก แฃแแแขแแกแแแแก แกแญแแ แแแแ แแแแแชแแแแแแก แกแแแแ แจแแแแฎแแ. แแแแขแแ แแ แฏแแ แฃแแแ แแแคแแฅแ แแแ แฌแ แแจแ แ แแแแ แชแแแแแแแแก แจแแขแแแแแแ. แกแแแแ แจแแแแกแฌแแแแแ แแแขแแแแแก, แแฃ แ แแแแ แฃแแแ แจแแชแแแแแ แกแฅแแแ แแกแ, แ แแ แจแแกแแซแแแแแแ แแงแแก แจแแคแแ แฎแแแแก แแแ แแจแ แแแแแแแแแ, แแแแแ แแแ แแแ แ แแแจแ แงแฃแ แแแฆแแแ แแแแแแแฎแแแแแ แแแ แกแแแแแก แกแฅแแแแแ.
แแแ แกแแแแแก แกแฅแแแ
แแ แกแขแแขแแแจแ แฉแแแ แแแแแแแงแแแแแ classpath:db/migration
). แแฅ แจแแแแซแแแแ แแแฎแแ แแกแแแ แแแแ แแชแแแก แคแแแแแแแก แแแแแแแแ
โโโ db
โโโ migration
โโโ V1__init.sql
โโโ V2__Add_surname.sql
โโโ V3__Final_migration.sql
โโโ V4__Remove_lastname.sql
แแ แแแแแแแแจแ แฉแแแ แแฎแแแแแ 4 แแแแ แแชแแแก แกแแ แแแขแก, แ แแแแแแแช, แแฃ แแแ แ แแ แแงแ แจแแกแ แฃแแแแฃแแ, แจแแกแ แฃแแแแแ แแ แแแแแแแแก แแแงแแแแแแ, แ แแแแกแแช แแแแแแแชแแ แแแแฌแงแแแ. แแแแแ แแแแแแฎแแแแ แแ แ-แแ แ แคแแแแก (V1__init.sql
) แ แแแแ แช แแแแแแแแ.
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');
แงแแแแแคแแ แ แแจแแแแแแ แแ แแฎแกแแแแแ: แจแแแแซแแแแ แแแแแแงแแแแ SQL, แ แแแ แแแแกแแแฆแแ แแ, แแฃ แ แแแแ แฃแแแ แจแแแชแแแแแก แแฅแแแแ แแแแแชแแแแ แแแแ. แแแแแขแแแแแ แแแคแแ แแแชแแแกแแแแก Spring Boot-แแกแ แแ Flyway-แแก แจแแกแแฎแแ, แแฎแแแแ
แฌแงแแ แแก แแแแขแ แแแแก แฎแแแกแแฌแงแแก แแแแแงแแแแแแ Spring Boot, แแฅแแแ แแแแฆแแแ 2 แแแ แกแแ แแแแแแก:
- แแฅแแแ แแแแแกแฎแแแแแแ แแแแแชแแแแ แแแแแก แชแแแแแแแแแก แแแแแก แชแแแแแแแแแแกแแแ
- แแแแแชแแแแ แแแแแก แแแแ แแชแแ แฎแแแแ แแฅแแแแ แแแแแแแชแแแก แแแจแแแแแกแแแ แแ แแแ, แ.แ. แแฅแแแแ แแแแแแแแแแก แแ แแชแแกแ แแแแแ แขแแแแแฃแแแ
แแแแแชแแแแ แแแแแก แแ แแแแแแแแแก แแแแแแ แแแ
แกแขแแขแแแก แจแแแแแ แแแฌแแแจแ แฉแแแ แงแฃแ แแแฆแแแแก แแแแแแแฎแแแแแแ แแแแแชแแแแ แแแแแก แชแแแแแแแแแแก แแ แแแแแแแแแ.
- แฉแแแแ แฉแแแแแ แจแแฃแแแแกแแแแแแ
- แฉแแแแ แฉแแแแแ แแแแกแแแแแแแ
แแแ แแแแ แแแแแฎแแแแแ, แ แแแแ แช แแแคแ แแฎแแแแแ, แ แแ แแ แฃแแแ แจแแแกแ แฃแแแ แแฃแแแแแแ แจแแคแแ แฎแแแ แฌแแแแกแฌแแ แ แแแแแแแแแแก แแแ แแจแ... แแแแ แ แแแแแแแแแแก แแแแแกแแแแแก, แแฃ แ แแแแ แจแแแแซแแแแ แแแแแฎแแ แชแแแแแ แแแแแแแแแ แจแแคแแ แฎแแแแก แแแ แแจแ แแ แแแแแ แแ แแก แจแแแแแ แฉแฃแแแ แฃแแแ แแแแกแแแแแแแ.
แฉแแแแ แแ แแแฅแขแ, แ แแแแแแแช แฉแแแ แแแแฃแจแแแแแ, แแฅแแแแ แแแ แขแแแ Spring Boot Flyway แแแแแแแชแแ, แ แแแแแกแแช แแฅแแก Person
ั first_name
ะธ last_name
แแแแแชแแแแ แแแแแจแ (แแแแฎแ. แแแ แแแแแ: Person
แแ แแก แแแแแแ แแ แirst_name
ะธ last_name
- แแก แแ แแก แแแแแแ แแแกแจแ). แฉแแแ แแแแแแ แแแแแ แฅแแแแ last_name
ะฒ surname
.
แแแ แแฃแแแแ
แกแแแแ แแแขแแแแแก แจแแแแฎแแแแ, แแ แแก แ แแแแแแแแ แแแ แแฃแแ, แ แแแแแแช แฃแแแ แแแแแแแแแ แฉแแแแก แแแแแแแชแแแแแแ แแแแแแจแแ แแแแ. แแแแแแ แ แจแแแแแ, แ แแแแแก แแแฆแฌแแแแช แแแแแแ, แกแแแแแแ แแแ แขแแแ แแ แแชแแกแ แแฅแแแแ.
แจแแแแจแแแ. แแแแแแก PRO-TIP. แแ แแชแแกแแแแก แแแแแ แขแแแแแแ แจแแแซแแแแ แแแแแแแ แแแแ แ แคแฃแแ แแฎแแ แแแญแแ แแแ (แ แแช แแแขแ แแแแแแแแ แแงแแแ แแแกแแฅแแแแฃแแ แแฅแแแแก แแแแแแแแแจแ, แแแ แแแขแ แคแฃแแแก แแแแแแแ แจแแแแซแแแแ)!
แแ แแ แแก แกแแญแแ แ แแแแแชแแแแ แแแแแก แฃแแแ แแแแ แฃแแแแ
แแก แแแแ แขแแแแแก แแแแแแแแแแก แแ แแชแแกแก (แแแแแแ แแ แแแแแชแแแแ แแแแแก แฃแแแ แแแแ แฃแแแแ แแแแฅแแแก แจแแฃแซแแแแแแแ, แ แแแแ แแชแแ แฌแแจแแแก แฃแแแ แแแแ แฃแแแแ). แฉแแแ แฃแ แฉแแแแแแ แแฎแแแแ แแแแแแแชแแแแแก แฃแแแ แแแแ แฃแแแแ. แแ แแแแ, แแแจแแแแช แแ, แแฃ แแฅแแแ แแแฅแแ แกแฎแแแแแกแฎแแ แแแแแชแแแแ แแแแ (แแแแแแแแแ, SQL แแ NoSQL), แแฅแแแแ แแแแแแแแแแก แแแแกแแแแแ แแ แแแแแ แแ แแแแแแงแฃแ แแแ.
แงแแแแแแแแก แฃแแแ แแงแแก แจแแกแแซแแแแแแ แแแแแแแชแแแก แแ แแ แแแ แกแแแก แฃแแแ แแแแ แฃแแแแ (แแ แ แแแขแ)
แฃแแแ แแแแ แฃแแแแ แฃแแแ แแแฎแแแก แแฎแแแแ แกแแญแแ แแแแแก แจแแแแฎแแแแแจแ. แแฃ แแแแแแแแ แ แแแ แกแแแจแ แแ แแก แจแแชแแแแ, แ แแแแแแช แแแแแแแ แแ แแแแแกแฌแแ แแแแ, แฉแแแ แฃแแแ แจแแแซแแแ แฃแแฎแแแก แกแแแฃแจแแ แแแ แกแแแแ แแแแ แฃแแแแ. แฉแแแ แแแแ แแฃแแแแ, แ แแ แแก แฃแแฎแแแกแ แกแแแฃแจแแ แแแ แกแแ แฌแแแแ. แแแแแกแ แแ แแแแแชแแแแ แแแแแก แแแแกแแแแแแแแก แจแแแแ แฉแฃแแแแ แแ แแแ แแแขแ แแแจแแแแแกแแแแก แซแแแแแ แ แแฃแแ แแ แซแแแ แ แแฅแแแแ.
แจแแแแจแแแ. แแแขแ แฌแแแแแฎแแแกแแแแก, แแ แกแขแแขแแแจแ แฉแแแ แจแแแชแแแแ แแแแแแแชแแแก แแแแแแ แแแ แกแแแก.
แแแแแฏแ 1: แกแแฌแงแแกแ แแแแแแแ แแแแ
แแแแก แแแ แกแแ: 1.0.0
DB แแแ แกแแ: v1
แแแแแแขแแ แแแ
แแก แแฅแแแแ แแแแแชแฎแแแแก แกแแฌแงแแกแ แแแแแแแ แแแแ.
แแแแแชแแแแ แแแแ แแชแแแแแ
DB แจแแแชแแแก 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');
แแแแ แแชแแแแแ
แแแแแแแชแแ แแแแฎแแแก แแแ แแแแแแแก แแแแแชแแแแแก 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
+ "]";
}
}
แกแแแขแแก แฃแแแ แจแแฃแแแแกแแแแแ แแแแแ แฅแแแแ
แแแแแ แจแแแฎแแแแ แแแแแแแแก, แแฃ แ แแแแ แฃแแแ แจแแชแแแแแ แกแแแขแแก แกแแฎแแแ:
แงแฃแ แแแฆแแแ. แจแแแแแแ แแแแแแแแ แแแแแ แแฎ แแ แฆแแแแก แแแแแแแก. แฉแแแ แแแฉแแแแแแ แแแแก แแแแแชแแแแ แแแแแก แแแแกแแแแแแแแก แแ แแแแแแแก แแแแแแกแขแ แแ แแแแกแแแแก.
แแแแก แแแ แกแแ: 2.0.0.BAD
DB แแแ แกแแ: v2bad
แแแแแแขแแ แแแ
แแแแแแแแ แ แชแแแแแแแแแ แแ แแแแซแแแแก แกแแจแฃแแแแแแก แแแแฃแจแแแ แแ แ แแแกแขแแแชแแ (แซแแแแ แแ แแฎแแแ) แแ แแแ แแฃแแแ. แแแ แแแแ, แแฃแแแแแแ แจแแคแแ แฎแแแแก แแแแแแแแแ แซแแแแ แแฅแแแแ (แแฃ แแแ แแฃแแแแ แแแแแแแแกแฌแแแแแฃแแ แแฅแแแแ, แแก แ แแแแฃแ แแ แจแแฃแซแแแแแแแ).
A/B แขแแกแขแแ แแแ
แแแแแแแแแแแ แกแแขแฃแแชแแ แแ แแก แแก, แ แแ แฉแแแ แแแแฅแแก แแแแแแแชแแแก แแแ แกแแ 1.0.0,
แแแแแแแแแฃแแแ แฌแแ แแแแแแจแ แแ แแแแแชแแแแ แแแแแจแ v1
. แฉแแแ แฃแแแ แแแแแแแแแกแแ แแแแแแแชแแแก แแแแ แ แแแกแขแแแชแแ, แแแ แกแแ 2.0.0.BAD
แแ แแแแแแฎแแแ แแแแแชแแแแ แแแแ v2bad
.
แแแแแฏแแแ:
- แแแแแแแแแฃแแแ แแแ แกแแแก แแแแแแแชแแแก แแฎแแแ แแแแแแแแ
2.0.0.BAD
แ แแแแแแช แแแแแแฎแแแแก แแแแแชแแแแ แแแแแกv2bad
- แแแแแชแแแแ แแแแแจแ
v2bad
แกแแแขแlast_name
แแฆแแ แแ แกแแแแแก - แแก แจแแแชแแแแsurname
- แแแแแชแแแแ แแแแแกแ แแ แแแแแแแชแแแก แแแแแฎแแแแ แฌแแ แแแขแแแแ แแแกแ แฃแแแ แแ แแแแแแ แแ แแแกแขแแแชแแ แแแจแแแแฃแแแ
1.0.0
, แกแฎแแแแ - แจแ2.0.0.BAD
. แงแแแแแคแแ แ แแแแแแจแแ แแแฃแแแ แแแแแชแแแแ แแแแแกแแแv2bad
- แแแ แกแแแก แงแแแแ แจแแแแฎแแแแ
1.0.0
แแแแฌแงแแแแ แจแแชแแแแแแก, แ แแแแแ แแกแแแ แจแแแชแแแแแแ แแแแแชแแแแ แฉแแกแแแก แกแแแขแจแlast_name
แ แแแแแแช แแฆแแ แแ แกแแแแแก - แแแ แกแแแก แงแแแแ แจแแแแฎแแแแ
2.0.0.BAD
แแแฃแจแแแแแก แฃแแ แแแแแแแ
แ แแแแ แช แฎแแแแแ, แแฃ แแแแแชแแแแ แแแแแกแ แแ แแแแแแแชแแแจแ แฃแแฃแฆแแ แจแแฃแแแแกแแแแ แชแแแแแแแแแก แแแแแแฎแแ แชแแแแแแ, A/B แขแแกแขแแ แแแ แจแแฃแซแแแแแแแ.
แแแแแชแฎแแแแก แแแแ แฃแแแแ
แแแแฃแจแแแ, แ แแ A/B แแแแแแแแแแก แแชแแแแแแแก แจแแแแแ (แแแแฎแ. แแแ .: แแแขแแ แ แแฅ แแแแแ A/B แขแแกแขแแ แแแแก แแฃแแแกแฎแแแแแ) แแแแแแฌแงแแแขแแ, แ แแ แฃแแแ แแแแแแ แฃแแแ แแแแแแแชแแ แแแ แกแแแแ 1.0.0.
แแแฅแแแ, แ แแ แแ แแแแแแ แแแแแชแแแแ แแแแแก แฃแแแ แแแแ แฃแแแแ.
แแแแแฏแแแ:
- แฉแแแ แแแฉแแ แแแ แแแ แกแแแก แแแแแแแชแแแก แแแแแแแแก
2.0.0.BAD
- แแแแแชแแแแ แแแแ แฏแแ แแแแแ แแ แแก
v2bad
- แแแ แกแแแแแ แแแงแแแแแฃแแ
1.0.0
แแ แแกแแแก แ แ แแ แแกsurname
, แจแแชแแแแแแก แแแแแแแฎแแแ - แฏแแฏแแฎแแแ แแแแจแแแ, แฉแแแ แฃแแแ แแแฆแแ แแแแแ แฃแแแแแแ
แ แแแแ แช แฎแแแแแ, แแฃ แแแแแชแแแแ แแแแแกแ แแ แแแแแแแชแแแจแ แฃแแฃแฆแแ แจแแฃแแแแกแแแแ แชแแแแแแแแแก แแแแแแแแ, แฌแแแ แแแ แกแแแแ แแแแ แฃแแแแแก แแแ แจแแแซแแแแ.
แกแแ แแแขแแก แจแแกแ แฃแแแแแก แแฃแ แแแแแแ
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"}
แแแแแชแแแแ แแแแ แแชแแแแแ
แแแแ แแชแแแก แกแแ แแแขแ, แ แแแแแแช แแแแแ แฅแแแแก last_name
ะฒ surname
แฌแงแแ แ Flyway แกแแ แแแขแ:
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');
แกแแ แแแขแ, แ แแแแแแช แแแแแ แฅแแแแก last_name
.
-- This change is backward incompatible - you can't do A/B testing
ALTER TABLE PERSON CHANGE last_name surname VARCHAR;
แแแแ แแชแแแแแ
แฉแแแ แจแแแชแแแแแ แแแแแก แกแแฎแแแ lastName
on surname
.
แกแแแขแแก แแแแแ แฅแแแแ แฃแแฃแฆแแ แแแแกแแแแแ แแแแ
แแก แแ แแก แงแแแแแแ แแแแ แชแแแแแฃแแ แกแแขแฃแแชแแ, แ แแแแแแช แจแแแซแแแแ แจแแแแฎแแแแก. แฉแแแ แฃแแแ แแแแแแฎแแ แชแแแแแ แฃแแฃแฆแแ แจแแฃแแแแกแแแแแ แชแแแแแแแแแ. แฉแแแ แฃแแแ แแแแแแขแแแชแแ, แ แแ แแฃแแแแแแ แจแแคแแ แฎแแแแก แแแแแแแแแแกแแแแก, แฉแแแ แแ แฃแแแ แแแแแแแงแแแแ แแแแแชแแแแ แแแแแก แแแแ แแชแแ แแแแแขแแแแแ แแแแแฏแแแแก แแแ แแจแ. แกแขแแขแแแก แแ แแแฌแแแจแ แฉแแแ แจแแแแกแ แฃแแแแ แแแแแแแชแแแก 3 แแแแแแแแแแก แแแแแชแแแแ แแแแแก แแแแ แแชแแแแแแ แแ แแแ, แ แแแ แแแแแฆแฌแแแ แกแแกแฃแ แแแ แจแแแแแก แแ แจแแแแแแ แฉแฃแแแ แฃแแแ แแแแกแแแแแแแ.
แจแแแแจแแแ. แจแแแแฎแกแแแแแ, แ แแ แฉแแแ แแแแฅแแก แแแ แกแแแแแก แแแแแชแแแแ แแแแ
v1
. แแก แจแแแชแแแก แกแแแขแแแกfirst_name
ะธlast_name
. แฉแแแ แฃแแแ แจแแแแชแแแแแlast_name
onsurname
. แฉแแแ แแกแแแ แแแแฅแแก แแแแแแแชแแแก แแแ แกแแ1.0.0,
แ แแแแแแช แฏแแ แแ แแ แแก แแแแแงแแแแแฃแแsurname
.
แแแแแฏแ 2: แแแแแแขแแ แแแแ แ
แแแแก แแแ แกแแ: 2.0.0
DB แแแ แกแแ: v2
แแแแแแขแแ แแแ
แแฎแแแ แกแแแขแแก แแแแแขแแแแ แแ แแแกแ แจแแแแแแกแแก แแแแแ แแแแ, แฉแแแ แแฅแแแแ แแแแแชแแแแ แแแแแก แชแแแแแแแแแก. แแแแแแ แแฃแแแ, แแฃ แฉแแแ แแแแแแ แฃแแแแ JAR-แก แแ แแแแฅแแก แซแแแแ JAR แแแจแแแแฃแแ, แแก แแ แแแขแงแแแแ แจแแกแ แฃแแแแแก แแ แแก.
แฉแแแ แแแแแแแฅแแแงแแแแ แแฎแแ แแแ แกแแแก
แแแแแฏแแแ:
- แจแแแกแ แฃแแแ แแแแแชแแแแ แแแแแก แแแแ แแชแแ แแฎแแแ แกแแแขแแก แจแแกแแฅแแแแแแ
surname
. แแฎแแ แแฅแแแแ DB แแแ แกแแv2
- แแแแแชแแแแแแก แแแแแ แแแ
last_name
ะฒsurname
. แจแแแแจแแแแ แแ แแฃ แแฅแแแ แแแฅแแ แแแแ แ แแก แแแแแชแแแ, แฃแแแ แแแแแแแแแกแฌแแแแ แกแแ แแฃแแ แแแแ แแชแแ! - แแแฌแแ แแ แแแแ, แกแแแแช แแกแแแ แแแแแแงแแแแแ แแ แแแ ะธ แแฎแแแแแ แซแแแแ แกแแแขแ. แแฎแแ แแฅแแแแ แแแแแแแชแแแก แแแ แกแแ
2.0.0
- แฌแแแแแแฎแแ แแแแจแแแแแแแ แกแแแขแแแแ
surname
, แแฃ แแ แแ แแกnull
, แแ แast_name
แแฃsurname
แแแแแแแแฃแแ แแ แแ แแก. แจแแแแซแแแแ แฌแแจแแแแgetLastName()
แแแแแแแ, แ แแแแแ แแก แแแแแแnull
แแฅแแแแ แแแแแชแฎแแแแก แฃแแแ แแแแ แฃแแแแแกแแก3.0.0
แแแ2.0.0
.
แแฃ แแงแแแแแ Spring Boot Flyway-แก, แแก แแ แ แแแแแฏแ แจแแกแ แฃแแแแแ แแแ แกแแแก แแแจแแแแแก แแ แแก 2.0.0
แแแแแแแชแแแแ. แแฃ แแฅแแแ แแงแแแแแ แแแแแชแแแแ แแแแแก แแแ แกแแแแแก แฎแแแกแแฌแงแแก แฎแแแแ, แแแแกแแแแแก แแแแแฌแแแ แแ แ แแแแกแฎแแแแแแฃแแ แแแฅแแแแแแแก แแแแแแแแ (แฏแแ แแแแแแฎแแแ db แแแ แกแแ แฎแแแแ แแ แจแแแแแ แแแแแแแแกแแ แแฎแแแ แแแแแแแชแแ).
แแแแจแแแแแแแแแแ. แแแฎแกแแแแแ, แ แแ แแฎแแแ แจแแฅแแแแแ แกแแแขแ แฒแฒ แฒฃแฒแฒแฒ แแงแแก NULL แแ แแ แแก. แแฃ แแแแแ แฃแแแแ, แซแแแแแ แแแแแแแชแแแ แแ แแชแแก แแฎแแแ แกแแแขแแก แจแแกแแฎแแ แแ แแ แแแแแแกแขแแแแ แแแก แแแก
Insert.
แแแแ แแ แแฃ แแแแแแขแแแ แแ แจแแแฆแฃแแแแก แแ แแฅแแแแ db แแฅแแแแv2
, แแก แแแแแฎแแแก แแฎแแแ แกแแแขแแก แแแแจแแแแแแแแก แแแงแแแแแแก. แ แแช แแแแแแฌแแแแก แจแแแฆแฃแแแแแแก แแแ แฆแแแแแก.แแแแจแแแแแแแแแแ. แแฅแแแ แฃแแแ แแแแแฆแแ แแแแแแ
getLastName()
, แ แแแแแ แแแ แกแแแจแ3.0.0
แแแแจแ แแ แแ แแก แกแแแขแแก แแแแชแแคแชแแlast_name
. แแก แแแจแแแแก, แ แแ แแฅ แแฅแแแแ null แแแงแแแแแ. แจแแแแซแแแแ แแแขแแแแ แแแแแแ แแ แแแแแแขแแ แฉแแแแแnull
, แแแแ แแ แแแแ แแ แฃแแแแแกแ แแแแแกแแแแแ แแฅแแแแ แแแแแแแจแ แแแ แฌแแฃแแแแgetSurname()
แแฅแแแ แแแ แฉแแแ แกแฌแแ แ แแ แ-แแฃแแแแแแ แแแแจแแแแแแแ.
A/B แขแแกแขแแ แแแ
แแแแแแแแแแแ แกแแขแฃแแชแแ แแ แแก แแก, แ แแ แฉแแแ แแแแฅแแก แแแแแแแชแแแก แแแ แกแแ 1.0.0
, แแแแแแแแแฃแแแ แฌแแ แแแแแแแ แแ แแแแแชแแแแ แแแแแจแ v1
. แฉแแแ แฃแแแ แแแแแแแแแกแแ แแแ แกแแแก แแแแแแแชแแแก แแแแ แ แแแกแขแแแชแแ 2.0.0
แ แแแแแแช แแแแแแฎแแแแก แแแแแชแแแแ แแแแแก v2
.
แแแแแฏแแแ:
- แแแแแแแแแฃแแแ แแแ แกแแแก แแแแแแแชแแแก แแฎแแแ แแแแแแแแ
2.0.0
แ แแแแแแช แแแแแแฎแแแแก แแแแแชแแแแ แแแแแกv2
- แแแแกแแแแจแ แแแแแแ แแ แแแแฎแแแแ แแแแฃแจแแแแ แแแ แกแแแก แแแกแขแแแชแแแแแ
1.0.0
- แแแแแฎแแแแ แฌแแ แแแขแแแฃแแ แแงแ แแ แแฅแแแ แแแฅแแ แแแ แกแแแก แแแแแแแชแแแก แ แแแแแแแแ แแแจแแแแฃแแ แแแกแขแแแชแแ
1.0.0
แแ แกแฎแแ แแแ แกแแแแ2.0.0.
แงแแแแแก แแฅแแก แแแแฃแแแแแชแแ แแแแแชแแแแ แแแแแกแแแv2
- แแแ แกแแ
1.0.0
แแแแแชแแแแ แแแแแจแ แแ แแงแแแแแก แแแแ แแก แกแแแขแก, แแ แแแแ แแแ แกแแแก2.0.0
แแงแแแแแก. แแกแแแ แแ แแ แแแแแ แแ แแแแแแแก แแ แแ แฃแแแ แแงแแก แจแแชแแแแแแ. - แแแ แกแแ
2.0.0
แแแแฎแแแก แแแแแชแแแแแก แ แแแแ แช แซแแแ, แแกแ แแฎแแ แกแแแขแจแ, แ แแช แฃแแ แฃแแแแแงแแคแก แฃแแแ แแแแกแแแแแแแแก
แแแแจแแแแแแแแแแ. แแฃ แแฅแแแ แแแฅแแ แ แแแแ แจแแแแแฎแแ, แ แแแแแแช แแแแแแก แแแแแแแขแแแก แซแแแแ/แแฎแแแ แกแแแขแแก แแแแจแแแแแแแแแแ แแแงแ แแแแแแ, แฃแแแ แแแฎแกแแแแแ, แ แแ แแฎแแ แแแฅแแ แแฃแแแแแแขแ แแแแจแแแแแแแแแ (แกแแแแ แแฃแแแ, แแกแแแ แฏแแ แแแแแ แแแแ แแ แแแแ). แแแแแแแแแ, แแฃ แแกแฃแ แ แแแแแแแแ แแ แแแแฎแแแ แแแแแแแก แ แแแแแแแแ, แ แแแแแแ แแแแ แ (แ แแช แแ แฃแแแ แแ แฅแแแก แกแแแขแก) แแฌแงแแแ แแกแแแ
A
, แจแแแแแ แแแแแชแแแแ แแแแ แแชแแแก แแแกแ แฃแแแแแแแ (old
โnew
แกแแแขแ) แจแแแซแแแแ แแฅแแแแแ แแ แแแแแแแแแแแ แฃแแ แแแแแชแแแแแ, แแฃ แแฅแแแ แแแแแฎแแแ แแฎแแ แกแแแขแก.
แแแแแชแฎแแแแก แแแแ แฃแแแแ
แแฎแแ แฉแแแ แแแแฅแแก แแแแแแแชแแแก แแแ แกแแ 2.0.0
แแ แแแแแชแแแแ แแแแแจแ v2
.
แแแแแฏแแแ:
- แแแแแ แฃแแแ แแฅแแแแ แแแแแแแชแแ แแแ แกแแแแ
1.0.0
. - แแแ แกแแ
1.0.0
แแ แแงแแแแแก แกแแแขแก แแแแแชแแแแ แแแแแจแsurname
แแกแ แ แแ, แแแแ แฃแแแแ แฌแแ แแแขแแแฃแแ แฃแแแ แแงแแก
DB แแชแแแแแ
แแแแแชแแแแ แแแแ แจแแแชแแแก แกแแแขแก แกแแฎแแแแ last_name
.
Flyway แฌแงแแ แแก แกแแ แแแขแ:
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');
แกแแ แแแขแแก แแแแแขแแแ surname
.
แงแฃแ แแแฆแแแ. แแแฎแกแแแแแ, แ แแ แแฅแแแ แแ แจแแแแซแแแแ แแแแแแขแแ NOT NULL แจแแแฆแฃแแแแแ แกแแแขแจแ, แ แแแแแกแแช แแแแขแแแ. แแฃ JAR-แก แแแแแ แฃแแแแ, แซแแแ แแแ แกแแแก แฌแแ แแแแแแแ แแ แแฅแแแแ แแแแแขแแแฃแแ แกแแแขแแก แจแแกแแฎแแ แแ แแแขแแแแขแฃแ แแ แแแแงแแแแแก แแแก NULL-แแ. แแฃ แแ แกแแแแแก แแกแแแ แจแแแฆแฃแแแ, แซแแแแ แแแแแแแชแแ แฃแแ แแแแ แแจแแแแ.
-- 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
แแแแ แแชแแแแแ
แฉแแแ แแแแแฎแแแ แแแแแชแแแแแก แ แแแแ แช last_name
, แแ surname
. แแแแแ แแ แแก แแแแแฎแฃแแแแ 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;
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
+ "]";
}
}
แแแแแฏแ 3: แแแแ แแก แแแแฆแแแ แแแแแแแ
แแแแก แแแ แกแแ: 3.0.0
DB แแแ แกแแ:v3
แแแแแแขแแ แแแ
แจแแแแจแแแ แแแ .: แ แแแแ แช แฉแแแก, แแแแแแแแ แแแ แกแขแแขแแแจแ แแแขแแ แแ แจแแชแแแแแ แแแแแแแแ แ แแ แแแแแแก แขแแฅแกแขแ แแ-2 แกแแคแแฎแฃแ แแแแ. แแ แแขแแแแ แชแแแแแแแแแ แฃแแแ แแแแฎแแ แชแแแแแแก แแแแแแแชแแแก แแแแจแ, แ แแแแแแช แแแแแแ แแกแแฎแแแก แแ แคแฃแแฅแชแแแก แแแแฆแแแแก, แ แแแแแแช แแงแแแแแก แกแแแขแก. last_name
.
แแฎแแแ แกแแแขแแก แแแแแขแแแแ แแ แแแกแ แจแแแแแแกแแก แแแแแ แแแแ, แฉแแแ แจแแแฅแแแแแ แแแแแชแแแแ แแแแแก แฃแแแ แแแแกแแแแแ แชแแแแแแแแแ. แแกแแแ, แแฃ แฉแแแ แแแแแแ แฃแแแแ JAR-แก แแ แแแแฅแแก แซแแแแ JAR แแแจแแแแฃแแ, แแก แแ แแแขแงแแแแ แจแแกแ แฃแแแแแก แแ แแก.
แแแแแชแฎแแแแก แแแแ แฃแแแแ
แแแแแแแ แแแแฅแแก แแแแแแแชแแแก แแแ แกแแ 3.0.0
แแ แแแแแชแแแแ แแแแ v3
. แแแ แกแแ 3.0.0
แแ แแแแฎแแแก แแแแแชแแแแแก last_name
. แแก แแแจแแแแก, แ แแ แจแ surname
แแแแฎแแแ แงแแแแแแ แฃแแฎแแแกแ แแแคแแ แแแชแแ.
แแแแแฏแแแ:
- แแแแแ แฃแแแ แแฅแแแแ แแแแแแแชแแ แแแ แกแแแแ
2.0.0
. - แแแ แกแแ
2.0.0
แแงแแแแแก แแlast_name
ะธsurname
. - แแแ แกแแ
2.0.0
แแแแฆแแแกsurname
, แแฃ แแก แแ แแ แแก แแฃแแ, แฌแแแแแฆแแแแ แจแแแแฎแแแแแจแ -last_name
แแแแแชแแแแ แแแแ แแชแแแแแ
แแแแแชแแแแ แแแแแจแ แกแขแ แฃแฅแขแฃแ แฃแแ แชแแแแแแแแแ แแ แแ แแก. แจแแแแแแ แกแแ แแแขแ แจแแกแ แฃแแแแฃแแแ แซแแแแ แแแแแชแแแแแแก แกแแแแแแ แแแแ แแชแแแก แจแแกแแกแ แฃแแแแแแ:
-- 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;
แแแแ แแชแแแแแ
แจแแแแจแแแ แแแ .: แแ แแแแแแก แแฆแฌแแ แ แแแขแแ แแ แแกแแแ แจแแชแแแแแ แแแแแแแแ แ แแ-2 แกแแคแแฎแฃแ แแแแ. แกแขแแขแแแก แแแแแแแก แจแแกแแแแแแกแแ, แแแแแก แชแแแแแแแแแ แแ แแขแแแแ แฃแแแ แแงแแก แแแแแ แแฃแแ แแแกแแแ แแแแแแแขแแแแก แแแแฆแแแแแ, แ แแแแแแแช แแฃแจแแแแแ แกแแแขแแแ. last_name
.
แฉแแแ แแแแแฎแแแ แแแแแชแแแแแก แ แแแแ แช last_name
, แแ surname.
แแแแแขแแแแ แแแแแฎแฃแแแแ แกแแแขแแแแ 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 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
+ "]";
}
}
แแแแแฏแ 4: แแแแ แแก แแแแฆแแแ แแแแแชแแแแ แแแแแแแ
แแแแก แแแ แกแแ: 4.0.0
DB แแแ แกแแ: v4
แแแแแแขแแ แแแ
แแแแก แแแแ, แ แแ แแแ แกแแแก แแแแ 3.0.0
แแ แแแแแแงแแแ แกแแแขแ last_name
, แชแฃแแ แแ แแคแแ แ แแแฎแแแแ แจแแกแ แฃแแแแแก แแ แแก, แแฃ แแแแฃแแ แฃแแแแแแ 3.0.0
แแแแแแแ แกแแแขแแก แแแแฆแแแแก แจแแแแแ.
แกแแ แแแขแแก แจแแกแ แฃแแแแแก แแฃแ แแแแแแ
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"}
DB แแชแแแแแ
แ แแช แจแแแฎแแแ v3
แฉแแแ แฃแแ แแแแ แแฎแกแแแ แกแแแขแก last_name
แแ แแแแแแขแแ แแแแแ แแฃแแ แจแแแฆแฃแแแแแ.
-- 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;
แแแแ แแชแแแแแ
แแแแจแ แชแแแแแแแแแ แแ แแ แแก.
แแแแแงแแแแแก
แฉแแแ แฌแแ แแแขแแแแ แแแแแแแงแแแแ แฃแแฃแฆแแ แจแแฃแแแแกแแแแแ แกแแแขแแก แกแแฎแแแแก แจแแชแแแ แ แแแแแแแแ แฃแแฃแแแแกแแแแแ แแแแแแแแแแก แจแแกแ แฃแแแแแ. แฅแแแแแ แแแชแแแฃแแแ แจแแกแ แฃแแแแฃแแ แแแฅแแแแแแแแแก แจแแฏแแแแแ:
- แแแแแแแชแแแก แแแ แกแแแก แแแแแแแกแแแ
1.0.0
ัv1
แแแแแชแแแแ แแแแแก แกแฅแแแ (แกแแแขแแก แกแแฎแแแ =last_name
) - แแแแแแแชแแแก แแแ แกแแแก แแแแแแแกแแแ
2.0.0,
แ แแแแแแช แแแแฎแแแก แแแแแชแแแแแกlast_name
ะธsurname
. แแแแชแฎแแแแแแจแ แแแแฅแแแแแlast_name
. แแแแแชแแแแ แแแแ แแ แแก แแแ แกแแแจแv2
แ แแแแแแช แจแแแชแแแก แกแแแขแแแก, แ แแแแ แแชแแlast_name
แแsurname. surname
แแกแแแ แast_name
. (แจแแแแจแแแ: แแ แกแแแขแก แแ แฃแแแ แฐแฅแแแแแก แแฃแแแแแแ แจแแแฆแฃแแแ) - แแแแแแแชแแแก แแแ แกแแแก แแแแแแแกแแแ
3.0.0
, แ แแแแแแช แแฎแแแแ แแแแแชแแแแแก แแแแฎแแแกsurname
แแ แแแแ แแแแ แแแแฎแฃแแแแก. แ แแช แจแแแฎแแแ แแแแแชแแแแ แแแแแก, แแแแ แแแแ แแชแแ แฎแแแแlast_name
ะฒsurname
. แแกแแแ แจแแแฆแฃแแแ NULL แแ แแ แแก แแแแแงแแแแแแแlast_name
. แแแแแชแแแแ แแแแ แแฎแแ แแแ แกแแแจแแv3
- แแแแแแแชแแแก แแแ แกแแแก แแแแแแแกแแแ
4.0.0
- แแแแจแ แชแแแแแแแแแ แแ แแ แแก แจแแขแแแแแ. แแแแแชแแแแ แแแแแก แแแแแแแแแv4
, แ แแแแแแช แจแแแกlast_name
. แแฅ แจแแแแซแแแแ แแแแแแขแแ แแแแแกแแแแ แ แแแแแขแแแแแฃแแ แจแแแฆแฃแแแ แแแแแชแแแแ แแแแแจแ.
แแ แแแแแแแแก แแแชแแแ, แแฅแแแ แงแแแแแแแแก แจแแแแซแแแแ แแแแแ แฃแแแ แแ แแ แแแ แกแแ แแแแแชแแแแ แแแแแก/แแแแแแแชแแแก แแแแกแแแแแแแแก แแแ แฆแแแแแก แแแ แแจแ.
แแแแ
แแ แกแขแแขแแแจแ แแแแแงแแแแแฃแแ แงแแแแ แแแแ แฎแแแแแกแแฌแแแแแแ แแแกแแแแ แแแ
แแ แแแฅแขแแแ
แกแแชแแแแก แแแแแแ แแแแก แจแแแแแ แแแฎแแแ แกแแฅแแฆแแแแแก แจแแแแแ แกแขแ แฃแฅแขแฃแ แแก.
โโโ 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)
แกแแ แแแขแแแ
แแฅแแแ แจแแแแซแแแแ แแแฃแจแแแ แฅแแแแแ แแแชแแแฃแ แกแแ แแแขแแแจแ แแฆแฌแแ แแแ แกแแ แแแขแแแ, แ แแแแแแแช แแฉแแแแแแแ แแแแแชแแแแ แแแแแก แฃแแแ แแแแกแแแแ แแ แจแแฃแแแแกแแแแ แชแแแแแแแแแก.
แกแแแแฎแแแแ แกแแฅแแ แฃแแฃแแแแกแแแแแ แชแแแแแแแแแแ, แแแฃแจแแแ:
./scripts/scenario_backward_compatible.sh
แแ แกแแแแฎแแแแ แจแแแแฎแแแแ แฃแแฃแฆแแ แจแแฃแแแแกแแแแแ แชแแแแแแแแแแ, แแแฃแจแแแ:
./scripts/scenario_backward_incompatible.sh
แกแแแแแแคแฎแฃแแ แฉแแฅแแแก แแแแฃแจแ Flyway
แงแแแแ แแแแแแแแ แแฆแแแฃแแแ Spring Boot Sample Flyway.
แจแแแแซแแแแ แแแแแฎแแแแ http://localhost:8080/flyway
, แแ แแก แกแแ แแแขแแแแก แกแแ.
แแก แแแแแแแแ แแกแแแ แแแแชแแแก H2 แแแแกแแแก (at http://localhost:8080/h2-console
) แแกแ แ แแ แแฅแแแ แจแแแแซแแแแ แแแฎแแ แแแแแชแแแแ แแแแแก แกแขแแขแฃแกแ (แแแแฃแแแกแฎแแแแ jdbc URL แแ แแก jdbc:h2:mem:testdb
).
แแแ แแ แแแแกแ
แแแแแชแแแแ แแแแแก แ แแคแแฅแขแแ แแ แแแแก แจแแแแแแแแ แฃแฌแงแแแขแ แแแฌแแแแแแก
แแกแแแ แฌแแแแแแฎแแ แกแฎแแ แกแขแแขแแแแ แฉแแแแก แแแแแแ:
Kubernetes: แ แแขแแ แแ แแก แแกแ แแแแจแแแแแแแแแ แกแแกแขแแแแก แ แแกแฃแ แกแแแแก แแแ แแแแก แแแแคแแแฃแ แแชแแ? Tekton Pipeline - Kubernetes-แแก แแจแแแแแฃแ แ แแแแกแแแแแแแ แแแแแแแฃแ แ แแแแฃแแแแแก แแแแแ Nginx-แแกแแแแก Hashicorp-แแก แแแแกแฃแแแก Kubernetes แแแขแแ แแแแชแแแก แจแแกแแแแแ แ แแก แแแฐแงแแ แแแแ แแชแแ ClickHouse-แแแ แแแขแแ แแแแชแแแก แแแ แแจแ ClickHouse-แจแ แแแขแแ แแแแชแแแก แแฅแแแ? แแแแแคแฎแฃแแแก แแแแแแแชแแแแแก แชแแกแคแแ แ-แแฌแแแแ แแแแแแแแแ Nginx แแแ แกแแ แแแ แแ
แฌแงแแ แ: www.habr.com