ืืขืจ ืึทืจืืืงื ืืขืจืงืืขืจื ืืื ืืขืืึทื ืืื ืฆื ืกืึธืืืืข ืืืืืึทืืืืก ืงืึทืืคึผืึทืืึทืืืืึทืื ืืฉืื ืืื ืืืคึผืืืืืึทื ื. ืืืจ ืืืขืื ืืึธืื ืืืจ ืืืึธืก ืงืขื ืขื ืคึผืึทืกืืจื ืืื ืืืื ืคึผืจืึธืืืงืฆืืข ืึทืคึผืืึทืงืืืฉืึทื ื ืืืื ืืืจ ืคึผืจืืืืจื ืฆื ืฆืขืืืืงืืขื ืึธื ืคึผืจืืืืืึทื ืขืจื ืฆืืืจืืืืื ื. ืืืจ ืืืขืื ืืขืจื ืึธื ืืืจืืืืื ืื ืกืืึทืืขืก ืคืื ืื ืึทืคึผืืึทืงืืืฉืึทื ืืืืคืกืืืงื ืืืึธืก ืืขื ืขื ืคืืจืืื ืื ืฆื ืืึธืื ื ืื ืืึทืื ืืืื (ืึทืคึผืคึผืจืึธืงืก. ืฉืืขื: ืืืืึทืืขืจ - ื ืื ืืึทืื ืืืื). ืืขืจ ืจืขืืืืืึทื ืคืื ืืื ืืืขืจ ืึทืคึผืขืจืืืฉืึทื ื ืืืขื ืืืื ืฆื ืฆืืืืืื ืื ืงืึทืคึผืืืขืจ-ืื ืงืึทืืคึผืึทืืึทืืึทื ืืึทืืึทืืืืก ืืืืฉื ืืื ืึท ืงืึทืคึผืืืขืจ-ืงืึทืืคึผืึทืืึทืืึทื ืฉืืืืืขืจ.
ืืืื ืืืจ ืืืืื ืฆื ืคึฟืึทืจืฉืืืื ืื ืงืึธื ืืืืฉืคืืื ืคืื ืืขื ืึทืจืืืงื, ืืืจ ืงืขื ืขื ืืขืคึฟืื ืขื ืืื ืืื
ืืงืืื
ื ืื ืืึทืื ืืืื ืืืคึผืืืืืึทื ื
ืืืึธืก ืึท ืืืกืืืฉ ื ืื ืืึทืื ืืืื ืืืคึผืืืืืึทื ื? ืืืจ ืงืขื ื ืืึธืื ืึทื ืืึธืก ืืื ืืืขื ืืืื ืึทืคึผืืึทืงืืืฉืึทื ืืื ืืืคึผืืืื ืืื ืึทืืึท ืึท ืืืขื ืึทื ืืืจ ืงืขื ืขื ืืฆืืื ืืึทืงืขื ืขื ืึท ื ืืึทืข ืืืขืจืกืืข ืคืื โโโโืื ืึทืคึผืืึทืงืืืฉืึทื ืฆื ืคึผืจืึธืืืงืฆืืข, ืืฉืขืช ืืขืจ ืืึทื ืืฆืขืจ ืงืขื ื ืืฉื ืืึทืืขืจืงื ืื ืึทื ืึทืืืืืืึทืืืืืื. ืคึฟืื ืึท ืืึทื ืืฆืขืจ ืืื ืคืืจืืข ืคึผืขืจืกืคึผืขืงืืืื, ืืึธืก ืืื ืืขืจ ืืขืกืืขืจ ืืขืืืขื ืืืคึผืืืืืึทื ื ืกืฆืขื ืึทืจ ืืืืึทื ืขืก ืึทืืึทืื ื ืืึท ืคึฟืขืึดืงืืืื ืฆื ืืืื ืืึทืงืขื ืขื ืืื ืืึทืื ืฆื ืืืื ืคืึทืจืคืขืกืืืงื ืึธื ืืืกืจืึทืคึผืฉืึทื.
ืืื ืฆื ืืขืจืืจืืืื ืืขื? ืขืก ืืขื ืขื ืขืืืขืืข ืืืขืื, ืืึธ ืืื ืืืื ืขืจ ืคืื ืืื:
- ืฆืขืืืืงืืขื ืืืขืจืกืืข ื ืื 1 ืคืื ืืืื ืืื ืกื
- ืืืจืืคืืจื ืึท ืืึทืืึทืืืืก ืืืืจืึทืืืึธื
- ืฆืขืืืืงืืขื ืืืขืจืกืืข #2 ืคืื ืืืื ืกืขืจืืืืก ืืื ืคึผืึทืจืึทืืขื ืืื ืืืขืจืกืืข #1
- ืืื ืืึทืื ืืื ืืืจ ืืขื ืึทื ืืืขืจืกืืข ื ืื 2 ืึทืจืืขื ืืื ืขืก ืืึธื, ืึทืจืึธืคึผื ืขืืขื ืืืขืจืกืืข ื ืื 1
- done!
ืืจืื ื, ืืื ื ืื ืขืก? ืฆืื ืืึทืืืืขืจื, ืืึธืก ืืื ื ืืฉื ืึทืืื ืคึผืฉืื, ืืื ืืืจ ืืืขืื ืงืืงื ืืื ืืขื ืืื ืืขืืึทื ืฉืคึผืขืืขืจ. ืืืฆื ืืึธืื ืก ืืฉืขืง ืื ืื ืืขืจ ืคืขืจืื ืคึผืจืึธืกื ืืืคึผืืืืืึทื ื ืคึผืจืึธืฆืขืก - ืืืื ืืจืื ืืืคึผืืืืืึทื ื.
ืืึธืื ืืืจ ืืืฅ ืืขืืขืจื ืคืื
- ืขื ืฉืืจ ืึทื ืฆืืืื ืขืงืืขืืคืืืจื ืคืื ืืืื ืคึผืจืึธืืืงืฆืืข ืงืึธื ("ืืืื" ืืื "ืืจืื") ืึทืจืืขื;
- ืืืจืขืงื ืึทืืข ืคืึทืจืงืขืจ ืฆื ืื ืืืื ืกืืืืืืข, ื.ื. ืึทืืื ืึทื ืคึผืจืึธืืืงืฆืืข URL ืก ืคืื ื ืืึธืจื;
- ืฆืขืืืืงืืขื ืืื ืคึผืจืืืืจื ืึทืืข ืึทืคึผืืึทืงืืืฉืึทื ืขื ืืขืจืื ืืขื ืืื ืึท ืืจืื ืกืืืืืืข;
- ืืึทืฉืืืืขื URL ืคืื ืืืื ืฆื ืืจืื ืกืืืืืืข
ืืืื ืืจืื ืืืคึผืืืืืึทื ื ืืื ืึท ืฆืืืึทื ื ืืืึธืก ืึทืืึทืื ืืืจ ืฆื ืืืืื ืืึทืงืขื ืขื ื ืืึทืข ืคึฟืขืึดืงืืืื ืึธื ืืึธืจื ืืืขืื ืืจืืืงืื ื ืคึผืจืึธืืืงืฆืืข. ืืึธืก ืืื ืจืขืื ืฆื ืืขื ืคืึทืงื ืึทื ืืคืืื ืืืื ืขืคึผืขืก ืืึทืคึผืึทื ื, ืืืจ ืงืขื ืขื ืืืืื ืฆืืจืืงืงืืืขื ืฆื ืื ืคืจืืขืจืืืงืข ืกืืืืืืข ืืืจื ืคืฉืื "ืคืืืืงืื ื ืึท ืืึทืฉืืืืขื."
ื ืึธื ืืืืขื ืขื ืึทืืข ืื ืืืืื, ืืืจ ืงืขื ืคืจืขืื ืื ืงืฉืื: ืืืึธืก ืืื ื ืื ืืึทืื ืืืื ืฆื ืืึธื ืืื ืืืื ืืจืื ืืืคึผืืืืืึทื ื?
ื ื, ืืื ืืึธืื ืืึทื ืฅ ืึท ืคึผืืึทืฅ ืืื ืคึผืจืึธืกื, ืืืืึทื ืฆื ืืึทืืื ืฆืืืื ืขืงืืขืืคืืืจื ืคืื ืืขืจ ืืขืืืืงืขืจ ืกืืืืืืข ืจืืงืืืืืขืจื ืืึธืคึผื ืื ืฆื ืืึทืืื ืืื. ืืึธืก ืืื ืืืึธืก ืขืืืขืืข ืืืื ืคืึธืืขืจื
ืื ืื ืืขืจ ืึธืคึผืฆืืข ืืื ืฆื ื ืืฆื ืื ืืขืืืข ืืึทืืึทืืืืก, ืงืจืืืืืื ื ืืืื-ืืจืื ืกืืืืืฉืื ืคึฟืึทืจ ืื ืืืขื ืืื ืคืขืื ืืืึทืขืจืก. ืืื ืืขื ืฆืืืึทื ื, ืื ืืึทืืึทืืืืก ืงืขื ืึธืคื ืืืื ืึท ืคึผืจืึธืืืขื, ืกืคึผืขืฆืืขื ืืืขื ืืืจ ืืึทืจืคึฟื ืฆื ืืืืฉื ืื ืกืืขืืข ืฆื ืฉืืืฆื ืึท ื ืืึทืข ืืืขืจืกืืข ืคืื โโโโืื ืืืืืืืืืจื.
ืืื ืืึธ ืืืจ ืงืืืขื ืฆื ืื ืืืืคึผื ืคึผืจืึธืืืขื ืืื ืืขื ืึทืจืืืงื. Database. ืืื ืก ื ืขืืขื ืื ืื ืืขืจ ืงืืง ืืื ืืขื ืคืจืึทืืข.
ืืืจืืคืืจื ืึท ืืึทืืึทืืืืก ืืืืจืึทืืืึธื.
ืืืฆื ืืืจ ืืึธืื ืฆื ืคืจืขืื ืืื ืื ืงืฉืื - ืืืึธืก ืืืื ืื ืืึทืืึทืืืืก ืขื ืืขืจืื ื ืืื ื ืืฉื ืงืึทืคึผืืืขืจ ืงืึทืืคึผืึทืืึทืืึทื? ืืืขื ื ืืฉื ืืืื ืขืจืฉืืขืจ ืืืขืจืกืืข ืคืื โโืื ืึทืคึผ ืืจืขืื? ืืื ืคืึทืงื, ืืึธืก ืืื ืคึผืื ืงื ืืืึธืก ืืืขื ืคึผืึทืกืืจื ...
ืืคืืื ืืจืึธืฅ ืื ืจืืืืง ืืขื ืขืคืืฅ ืคืื ื ืื ืืึทืื ืืืื / ืืืื ืืจืื ืืืคึผืืืืืึทื ื, ืงืึธืืคึผืึทื ืืขืก ืืขื ื ืฆื ื ืึธืืคืึธืืื ืื ืคืืืืขื ืืข ืกืึทืคืขืจ ืคึผืจืึธืฆืขืก ืคึฟืึทืจ ืืืคึผืืืืื ื ืืืืขืจ ืึทืคึผืืึทืงืืืฉืึทื ื:
- ืฆืืืจืืืื ืึท ืคึผืขืงื ืืื ืึท ื ืืึทืข ืืืขืจืกืืข ืคืื โโโโืื ืึทืคึผืืึทืงืืืฉืึทื
- ืคืึทืจืืึทืื ืึท ืคืืืกื ืืืง ืึทืคึผืืึทืงืืืฉืึทื
- ืืืืคื ืกืงืจืืคึผืก ืฆื ืืืืืจืืื ืื ืืึทืืึทืืืืก
- ืฆืขืืืืงืืขื ืืื ืงืึทืืขืจ ืึท ื ืืึทืข ืืืขืจืกืืข ืคืื โโโโืื ืึทืคึผืืึทืงืืืฉืึทื
ืืื ืืขื ืึทืจืืืงื, ืืืจ ืืืขืื ืืขืืึทื ืืื ืืืจ ืงืขื ืขื ืึทืจืืขืื ืืื ืืืื ืืึทืืึทืืืืก ืืื ืงืึธื ืฆื ื ืืฆื ื ืื ืืึทืื ืืืื ืืืคึผืืืืืึทื ื.
ืืึทืืึทืืึทืกืข ืืฉืื
ืืืื ืืืจ ืืึธืื ืึท ืกืืืืืืขืกืก ืึทืคึผืืึทืงืืืฉืึทื ืืืึธืก ืืื ื ืืฉื ืงืจืึธื ืงืืื ืืึทืื ืืื ืื ืืึทืืึทืืืืก, ืืืจ ืงืขื ืขื ืืึทืงืืืขื ื ืื ืืึทืื ืืืื ืืืคึผืืืืืึทื ื ืืืืื. ืฆืื ืืึทืืืืขืจื, ืจืืึฟ ืืืืืืืืืจื ืืึทืจืฃ ืฆื ืงืจืึธื ืืึทืื ืขืจืืขืฅ. ืืึธืก ืืื ืืืึธืก ืืืจ ืืึธื ืืจืึทืืื ืฆืืืื ืืึธื ืืืืืขืจ ืืืจ ืืึทืื ืขื ืืขืจืื ืืขื ืฆื ืื ืงืจืืึทื. ืืืืืขืจ ืืืจ ืืึทืงืืืขื ืืื ืื ืืขืืึทืืืก ืคืื ืืื ืฆื ืืืืฉื ืื ืกืืฉืขืืึท ืึทืืื ืึทื ืงืืื ืืึทืื ืืืื ืืืคึผืืืืืึทื ื ืืื ืืขืืืขื, ืืึธืื ืืื ืื ืขืจืฉืืขืจ ืคืึธืงืืก ืืืืฃ ืื ืืืขืจืกืืข ืกืืฉืขืืึท.
ืืืขืจืกืืข ืกืืขืืข
ืืื ืืขื ืึทืจืืืงื ืืืจ ืืืขืื ื ืืฆื 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, ืืฉืขืง ืืืืก
ืืืจื ื ืืฆื ืึท ืืงืืจ ืงืึธื ืืจืึธื ืืขืฆืืึทื ืืื ืกืคึผืจืื ื ืืึธืึธื, ืืืจ ืืึทืงืืืขื 2 ืืจืืืก ืืขื ืขืคืืฅ:
- ืืืจ ืืึทืืื ืืขืจ ืืืืืึทืืืืก ืขื ืืขืจืื ืืขื ืคืื ืงืึธื ืขื ืืขืจืื ืืขื
- ืืึทืืึทืืึทืกืข ืืืืจืึทืืืึธื ืึทืงืขืจื ืฆืืืืืขื ืืื ืื ืจืึธืืืึทืื ืคืื ืืืื ืึทืคึผืืึทืงืืืฉืึทื, ื"ื. ืืืื ืืืคึผืืืืืึทื ื ืคึผืจืึธืฆืขืก ืืื ืกืืืคึผืืึทืคืืื
ืืจืึธืืืืขืฉืึธืึธืืื ื ืืืืืึทืืืืก ืคึผืจืึธืืืขืืก
ืืื ืืขืจ ืืืืึทืืขืจ ืึธืคึผืืืืืื ื ืคืื ืืขื ืึทืจืืืงื, ืืืจ ืืืขืื ืคืึธืงืืก ืืืืฃ ืฆืืืื ืึทืคึผืจืึธืืืฉืื ืฆื ืืึทืืึทืืืืก ืขื ืืขืจืื ืืขื.
- ืฆืืจืืง ืื ืงืึทืืคึผืึทืืึทืืืืึทืื
- ืฆืืจืืง ืงืึทืืคึผืึทืืึทืืืืึทืื
ืืขืจ ืขืจืฉืืขืจ ืืืื ืขืจ ืืืขื ืืืื ืืขืจืขืื ื ืืื ืึท ืืืืจืขื ืื ื ืึทื ืืืจ ืืึธื ื ืืฉื ืืืจืืคืืจื ื ืื ืืึทืื ืืืื ืืืคึผืืืืืึทื ื ืึธื ืคึผืจืืืืืึทื ืขืจื ืฆืืืจืืืืื ื ... ืื ืฆืืืืืืข ืึธืคืคืขืจืก ืึท ืืืืืื ื ืืื ืืืจ ืงืขื ืขื ืืืจืืคืืจื ืึท ืืืคึผืืืืืึทื ื ืึธื ืืึทืื ืืืื ืืื ืืื ืืขืจ ืืขืืืืงืขืจ ืฆืืื ืืึทืืื ืฆืืจืืง ืงืึทืืคึผืึทืืึทืืืืึทืื.
ืืื ืืืขืจ ืคึผืจืืืขืงื ืืืึธืก ืืืจ ืืืขืื ืึทืจืืขืื ืืืืฃ ืืืขื ืืืื ืึท ืคึผืฉืื Spring Boot Flyway ืึทืคึผืืึทืงืืืฉืึทื Person
ั first_name
ะธ last_name
ืืื ืื ืืึทืืึทืืืืก (ืึทืคึผืคึผืจืึธืงืก. ืืืืขืจืืขืฆืื ื: Person
ืืื ื ืืืฉ ืืื ืคirst_name
ะธ last_name
โ ืืึธืก ืืฒึทื ืขื ืื ืคึฟืขืืืขืจ ืืื ืืื). ืืืจ ืืืืื ืฆื ืจืขื ืึทืืข last_name
ะฒ surname
.
ืึทืกืึทืืคึผืฉืึทื ื
ืืืืืขืจ ืืืจ ืืึทืงืืืขื ืืื ืื ืืขืืึทืืืก, ืขืก ืืขื ืขื ืึท ืคึผืึธืจ ืคืื ืึทืกืึทืืคึผืฉืึทื ื ืืืึธืก ืืืจ ืืึทืจืคึฟื ืฆื ืืึทืื ืืืขืื ืืื ืืืขืจ ืึทืคึผืืึทืงืืืฉืึทื ื. ืืขืจ ืืืืคึผื ืจืขืืืืืึทื ืืืึธืก ืืืจ ืืืืื ืฆื ืืขืจืืจืืืื ืืืขื ืืืื ืึท ืืึทื ืฅ ืคึผืฉืื ืคึผืจืึธืฆืขืก.
ืื ืืึธื. ืืขืฉืขืคื ืคึผืจืึธ-ืืืคึผ. ืกืืืคึผืืืคืืื ื ืคึผืจืึทืกืขืกืึทื ืงืขื ืขื ืจืึทืืขืืืขื ืืืจ ืึท ืคึผืืึทืฅ ืคืื ืืขืื ืืืืฃ ืฉืืืฆื (ืื ืืขืจ ืืขื ืืฉื ืืืจ ืืึธืื ืืจืืขืื ืคึฟืึทืจ ืืืื ืคืืจืืข, ืื ืืขืจ ืืขืื ืืืจ ืงืขื ืขื ืฉืคึผืึธืจื)!
ื ืื ืืึทืจืคึฟื ืฆื ืฆืืจืืงืงืจืืื ืื ืืึทืืึทืืืืก
ืืขื ืกืืืคึผืืึทืคืืื ืื ืืืคึผืืืืืึทื ื ืคึผืจืึธืฆืขืก (ืขืืืขืืข ืืึทืืึทืืืืก ืจืึธืืืืึทืงืงืก ืืขื ืขื ืึผืืขื ืืืืืขืืืขื, ืึทืืึท ืืื ืืืืืฉืึทื ืจืึธืืืืึทืง). ืืืจ ืืขืกืขืจ ืืืขืื ืฆื ืฆืืจืืงืงืจืืื ืืืืื ืึทืคึผืืึทืงืืืฉืึทื ื. ืืขื ืืืขื, ืืคืืื ืืืื ืืืจ ืืึธืื ืคืึทืจืฉืืืขื ืข ืืึทืืึทืืืืกืื (ืืืฉื, 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
ืืึทืืขืจืงืื ื
ืื ืงืจืึทื ื ืขื ืืขืจืื ืืขื ืืึธืื ืืื ืื ื ืืฉื ืืืืคื ืฆืืืื ืื ืกืืึทื ืกืื (ืึทืื ืืื ื ืืึท) ืืื ืืขืจ ืืขืืืืงืขืจ ืฆืืื. ืืืื, ื ืื ืืึทืื ืืืื ืืืคึผืืืืืึทื ื ืืืขื ืืืื ืฉืืืขืจ ืฆื ืืขืจืืจืืืื (ืืืื ืึทืกืึทืืคึผืฉืึทื ื ืืขื ืขื ืืขื ืืืขื ืืื ืืฉืืื, ืขืก ืืื ืคืืงืืืฉ ืืืืืขืืืขื).
ื / ื ืืขืกืืื ื
ืื ืืืฆืืืงืข ืกืืืืึทืฆืืข ืืื ืึทื ืืืจ ืืึธืื ืึท ืึทืคึผืืึทืงืืืฉืึทื ืืืขืจืกืืข 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
ืืืขื ืึทืจืืขืื ืึธื ืคืจืืืืขืืขื
ืืื ืืืจ ืงืขื ืขื ืืขื, ืืืื ืืืจ ืืึทืื ืงืึทืคึผืืืขืจ ืื ืงืึทืืคึผืึทืืึทืืึทื ืขื ืืขืจืื ืืขื ืฆื ืื ืืึทืืึทืืืืก ืืื ืึทืคึผืืึทืงืืืฉืึทื, ืึท / ื ืืขืกืืื ื ืืื ืืืืืขืืืขื.
ืึทืคึผืคึผืืืงืึทืืืึธื ืจืึธืืืืึทืง
ืืึธืืืจ ืืืขืจื ืขืืขื ืึทื ื ืึธื ืืจืืื ื ืฆื ืืึธื ืึท / ื ืืืคึผืืืืืึทื ื (ืึทืคึผืคึผืจืึธืงืก. ืคึผืขืจ.: ืืขืจ ืืืืจ ืืืกืืึธืืข ืืขื ื ืึท / ื ืืขืกืืื ื ืืึธ) ืืืจ ืืึทืฉืืึธืกื ืึทื ืืืจ ืืึทืจืคึฟื ืฆื ืฆืืจืืงืงืจืืื ืื ืึทืคึผืืึทืงืืืฉืึทื ืฆื ืื ืืืขืจืกืืข 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
ืืงืืจ ืคืืืืืืึท ืฉืจืืคื:
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
ืืืืฃ surname
.
ืจืื ืืืืื ื ืึท ืืืึทื ืืื ืึท ืงืึทืคึผืืืขืจ-ืงืึทืืคึผืึทืืึทืืึทื ืืืขื
ืืึธืก ืืื ืื ืืขืจืกื ืคึผืจืึธืกื ืกืืืืึทืฆืืข ืืืจ ืงืขื ืืจืขืคื. ืืืจ ืืึทืจืคึฟื ืฆื ืืึทืื ืงืึทืคึผืืืขืจ ืื ืงืึทืืคึผืึทืืึทืืึทื ืขื ืืขืจืื ืืขื. ืืืจ ืืึธืื ืฉืืื ืคึผืจืึธืืืขื ืึทื ืคึฟืึทืจ ื ืื ืืึทืื ืืืื ืืืคึผืืืืืึทื ื, ืืืจ ืืึธื ื ืืฉื ืคืฉืื ืฆืืืืืื ืืืืืึทืืืืก ืืืืจืึทืืืึธื ืึธื ื ืึธื ืกืืขืคึผืก. ืืื ืืขื ืึธืคึผืืืืืื ื ืคืื ืืขื ืึทืจืืืงื, ืืืจ ืืืขืื ืืืจืืคืืจื 3 ืืืคึผืืืืืึทื ืฅ ืคืื ืื ืึทืคึผืืึทืงืืืฉืึทื ืฆืืืืืขื ืืื ืืืืืึทืืืืก ืืืืืจืืืฉืึทื ื ืฆื ืืขืจืืจืืืื ืื ืืขืืืืื ืจืขืืืืืึทื ืืื ืืึทืืื ืฆืืจืืง ืงืึทืืคึผืึทืืึทืืืืึทืื.
ืื ืืึธื. ืฆืืจืืงืจืืคื ืึทื ืืืจ ืืึธืื ืึท ืืืขืจืกืืข ืืึทืืึทืืืืก
v1
. ืขืก ืึผืืื ืฉืคืืืืfirst_name
ะธlast_name
. ืืืจ ืืึธืื ืฆื ืืืืฉืlast_name
ืืืืฃsurname
. ืืืจ ืืืื ืืึธืื ืึทืคึผ ืืืขืจืกืืข1.0.0,
ืืืึธืก ืืื ื ืึธื ื ืืฉื ืืขื ืืฆืsurname
.
ืฉืจืื 2: ืืืื ืคืึทืืืืืข
ืึทืคึผ ืืืขืจืกืืข: 2.0.0
DB ืืืขืจืกืืข: v2
ืืึทืืขืจืงืื ื
ืืืจื ืึทืืื ื ืึท ื ืืึท ืืืึทื ืืื ืงืึทืคึผืืื ื ืืืึทื ืืื ืืึทืื, ืืืจ ืืึทืื ืงืึทืคึผืืืขืจ ืงืึทืืคึผืึทืืึทืืึทื ืืึทืืึทืืืืก ืขื ืืขืจืื ืืขื. ืืื ืืขืจ ืืขืืืืงืขืจ ืฆืืื, ืืืื ืืืจ ืจืึธืืืื ื ืื JAR ืึธืืขืจ ืืึธืื ืึทื ืึทืื JAR ืคืืืกื ืืืง, ืขืก ืืืขื ื ืืฉื ืืจืขืื ืืขืฉืึทืก ืืืจืืคืืจืื ื.
ืืืจ ืจืึธืืืื ื ืึท ื ืืึทืข ืืืขืจืกืืข
ืกืืขืคึผืก:
- ืืืจืืคืืจื ืึท ืืึทืืึทืืืืก ืืืืจืึทืืืึธื ืฆื ืฉืึทืคึฟื ืึท ื ืืึทืข ืืืึทื
surname
. ืืืฆื ืืืื ืื ืืืขืจืกืืข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
ืึทืคึผืืึทืงืืืฉืึทื ื. ืืืื ืืืจ ืืืืคื ืื ืืึทืืึทืืืืก ืืืขืจืกืืข ืืึทื ืืืึทืื, ืืืจ ืืืขื ืืึธืื ืฆื ืืึธื ืฆืืืื ืคืึทืจืฉืืืขื ืข ืืื ืื (ืขืจืฉืืขืจ ืืขืจืืืึทื ืืืงื ืื ืื ืืืขืจืกืืข ืืึทื ืืืึทืื ืืื ืืขืืึธืื ืฆืขืืืืงืืขื ืื ื ืืึทืข ืึทืคึผืืึทืงืืืฉืึทื).
ืขืก ืืื ืืืืืืืง. ืืขืืขื ืง ืึทื ืื ื ืื ืืืฉืืคื ืืืึทื ืืื ื ืืฉื ืืืึทื ื ืืฉื ื ืื. ืืืื ืืืจ ืืึธื ืึท ืจืึธืืืืึทืง, ืื ืึทืื ืึทืคึผืืึทืงืืืฉืึทื ืงืขื ื ืืฉื ืืืืกื ืืืขืื ืื ื ืืึทืข ืืืึทื ืืื ืืืขื ื ืืฉื ืื ืกืืึทืืืจื ืขืก ืืขืฉืึทืก
Insert.
ืึธืืขืจ ืืืื ืืืจ ืืืืื ืืขื ืงืึทื ืกืืจืืื ืฅ ืืื ืืืื ืื ืืืขื ืืืืv2
, ืืึธืก ืืืขื ืืึทืจืคื ืืึทืฉืืขืืืงื ืื ืืืขืจื ืคืื ืื ื ืืึทืข ืืืึทื. ืืืึธืก ืืืขื ืคืืจื ืฆื ืืืืืึทืืืืฉืึทื ื ืคืื ืจืืกืืจืืงืฉืึทื ื.ืขืก ืืื ืืืืืืืง. ืืืจ ืืึธื ืึทืจืึธืคึผื ืขืืขื ืืขื ืืืคึฟื
getLastName()
, ืืืืึทื ืืื ืื ืืืขืจืกืืข3.0.0
ืขืก ืืื ืงืืื ืืึทืืจืืฃ ืคืื ืึท ืืืึทื ืืื ืื ืงืึธืlast_name
. ืืขื ืืืื ืึทื ื ืึทื ืืืขื ืืืื ืืึทืฉืืืื ืืึธืจื. ืืืจ ืงืขื ืขื ืืึธืื ืืขื ืืืคึฟื ืืื ืืืืื ืืฉืขืงืก ืคึฟืึทืจnull
, ืึธืืขืจ ืึท ืคืื ืืขืกืขืจ ืืืืืื ื ืืืึธืื ืืืื ืฆื ืืึทืื ืืืืขืจ ืึทื ืืื ืื ืืึธืืืงgetSurname()
ืืืจ ืืึธื ืืืืกืืขืงืืืื ืื ืจืืืืืง ื ืื-ื ืื ืืืขืจื.
ื / ื ืืขืกืืื ื
ืื ืืืฆืืืงืข ืกืืืืึทืฆืืข ืืื ืึทื ืืืจ ืืึธืื ืึท ืึทืคึผืืึทืงืืืฉืึทื ืืืขืจืกืืข 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
.
ืคืืืืืืึท ืืงืืจ ืฉืจืืคื:
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
.
ืืืืื ื. ืืขืืขื ืงื ืึทื ืืืจ ืงืขื ืขื ื ืืฉื ืืืืื ืงืืื ื ืื-ื ืื ืงืึทื ืกืืจืืื ืฅ ืฆื ืื ืืืึทื ืืืจ ืืืืื. ืืืื ืืืจ ืจืึธืืืื ื ืื 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: ืจืืืืืืื ื last_name ืคืื ืื ืงืึธื
ืึทืคึผ ืืืขืจืกืืข: 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: ืจืืืืืืื ื last_name ืคึฟืื ืื ืืึทืืึทืืืืก
ืึทืคึผ ืืืขืจืกืืข: 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
. ืืืื ืึท ืืึทืืจืขื ืขืฆืื ื ื ืืฉื ื ืื ืืจืืคืืขื ืืืขื ืคืื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
ืคืจืืืื ื ืฉืืืืื ืกืึทืืคึผืืข ืคืืืืืืึท
ืึทืืข ืืืืฉืคืืื ืืขื ืขื ืืขื ืืืขื ืคืื Spring Boot Sample Flyway.
ืืืจ ืงืขื ืขื ื ืขืืขื ืึท ืงืืง ืืืึท http://localhost:8080/flyway
, ืขืก ืืื ืึท ืจืฉืืื ืคืื ืกืงืจืืคึผืก.
ืืขืจ ืืืืฉืคึผืื ืืืื ืืืื ืื H2 ืงืึทื ืกืึธืื (ืืืึท http://localhost:8080/h2-console
) ืึทืืื ืืืจ ืงืขื ืขื ืืขื ืื ืืึทืืึทืืืืก ืกืืึทืืืก (ืคืขืืืงืืึทื jdbc URL ืืื jdbc:h2:mem:testdb
).
ืึทืืืืืืึธื ืึทืืื
ืืึทืืึทืืึทืกืข ืจืขืคืึทืงืืืจืื ื ืคึผืึทืืขืจื ื ืงืขืกืืืืขืจืืืง ืขืงืกืคึผืจืขืก
ืืืืขื ืขื ืืืื ืื ืืขืจืข ืึทืจืืืงืืขื ืืืืฃ ืืื ืืืขืจ ืืืึธื:
Kubernetes: ืืืึธืก ืืื ืขืก ืึทืืื ืืืืืืืง ืฆื ืื ืกืืึทืืืจื ืกืืกืืขื ืจืืกืึธืจืก ืคืึทืจืืืึทืืืื ื? Tekton Pipeline - ืงืืืขืจื ืขืืขืก-ืืขืืืืจื ืคึผืืืคึผืืืื ื ืืืืขื ืืื ืึทืืืฉ ืืึทืืืฉืืื ืคึฟืึทืจ Nginx ืืงืืื ืฆื Hashicorp Consul's Kubernetes Authorization ืืืึธืก ืืื ืื ืืืืืจืืืฉืึทื ืคืื ืงืืืงืงืืึทืืก ืึธื ืืขืจืืืืืขื ืืฉ ืฆื ืงืืืงืืึธืืกืข ืืื ืืขืจืืืืืขื ืืฉ ืคืืจื ืฆื? ืืืื-ืืจืื ืืืคึผืืืืืึทื ื ืคืื ืกืคึผืจืื ื ืึทืคึผืืึทืงืืืฉืึทื ื ืืื Nginx ืืืขื ืกืขืจืืืขืจ
ืืงืืจ: www.habr.com