เจเจน เจฒเฉเจ เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจ เจฆเฉฑเจธเจฆเจพ เจนเฉ เจเจฟ เจคเฉเจจเจพเจคเฉ เจตเจฟเฉฑเจ เจกเฉเจเจพเจฌเฉเจธ เจ เจจเฉเจเฉเจฒเจคเจพ เจฎเฉเฉฑเจฆเจฟเจเจ เจจเฉเฉฐ เจเจฟเจตเฉเจ เจนเฉฑเจฒ เจเจฐเจจเจพ เจนเฉเฅค เจ เจธเฉเจ เจคเฉเจนเจพเจจเฉเฉฐ เจฆเฉฑเจธเจพเจเจเฉ เจเจฟ เจคเฉเจนเจพเจกเฉเจเจ เจชเฉเจฐเฉเจกเจเจธเจผเจจ เจเจชเจฒเฉเจเฉเจธเจผเจจเจพเจ เจฆเจพ เจเฉ เจนเฉ เจธเจเจฆเจพ เจนเฉ เจเฉเจเจฐ เจคเฉเจธเฉเจ เจฎเฉเฉฑเจขเจฒเฉ เจคเจฟเจเจฐเฉ เจคเฉเจ เจฌเจฟเจจเจพเจ เจคเฉเจจเจพเจค เจเจฐเจจ เจฆเฉ เจเฉเจธเจผเจฟเจธเจผ เจเจฐเจฆเฉ เจนเฉเฅค เจซเจฟเจฐ เจ เจธเฉเจ เจเจชเจฒเฉเจเฉเจธเจผเจจ เจฒเจพเจเจซเจธเจพเจเจเจฒ เจชเฉเจพเจตเจพเจ เจตเจฟเฉฑเจเฉเจ เจฒเฉฐเจเจพเจเจเฉ เจเฉ เจเจผเฉเจฐเฉ เจกเจพเจเจจเจเจพเจเจฎ (เจฒเจเจญเจ เจฒเฉเจจ: เจ เฉฑเจเฉ - เจเจผเฉเจฐเฉ เจกเจพเจเจจเจเจพเจเจฎ). เจธเจพเจกเฉ เจเจชเจฐเฉเจธเจผเจจเจพเจ เจฆเจพ เจจเจคเฉเจเจพ เจฌเฉเจเจตเจฐเจก-เจ เจธเฉฐเจเจค เจกเฉเจเจพเจฌเฉเจธ เจคเจฌเจฆเฉเจฒเฉ เจจเฉเฉฐ เจฌเฉเจเจตเจฐเจก-เจ เจจเฉเจเฉเจฒ เจคเจฐเฉเจเฉ เจจเจพเจฒ เจฒเจพเจเฉ เจเจฐเจจเจพ เจนเฉเจตเฉเจเจพเฅค
เจเฉเจเจฐ เจคเฉเจธเฉเจ เจฒเฉเจ เจคเฉเจ เจเฉเจก เจเจฆเจพเจนเจฐเจจเจพเจ เจจเฉเฉฐ เจธเจฎเจเจฃเจพ เจเจพเจนเฉเฉฐเจฆเฉ เจนเฉ, เจคเจพเจ เจคเฉเจธเฉเจ เจเจนเจจเจพเจ เจจเฉเฉฐ เจเฉฑเจฅเฉ เจฒเฉฑเจญ เจธเจเจฆเฉ เจนเฉ
เจเจพเจฃ เจชเจเจพเจฃ
เจเจผเฉเจฐเฉ เจกเจพเจเจจเจเจพเจเจฎ เจคเฉเจจเจพเจคเฉ
เจเฉ เจเฉฑเจ เจฐเจนเฉฑเจธเจตเจพเจฆเฉ เจเจผเฉเจฐเฉ เจกเจพเจเจจเจเจพเจเจฎ เจคเฉเจจเจพเจคเฉ? เจคเฉเจธเฉเจ เจเจนเจฟ เจธเจเจฆเฉ เจนเฉ เจเจฟ เจเจน เจเจฆเฉเจ เจนเฉเฉฐเจฆเจพ เจนเฉ เจเจฆเฉเจ เจคเฉเจนเจพเจกเฉ เจเจชเจฒเฉเจเฉเจธเจผเจจ เจจเฉเฉฐ เจเจธ เจคเจฐเฉเจเฉ เจจเจพเจฒ เจคเฉเจจเจพเจค เจเฉเจคเจพ เจเจพเจเจฆเจพ เจนเฉ เจเจฟ เจคเฉเจธเฉเจ เจชเฉเจฐเฉเจกเจเจธเจผเจจ เจฒเจ เจเจชเจฒเฉเจเฉเจธเจผเจจ เจฆเฉ เจเฉฑเจ เจจเจตเฉเจ เจธเฉฐเจธเจเจฐเจฃ เจจเฉเฉฐ เจธเจซเจฒเจคเจพเจชเฉเจฐเจตเจ เจชเฉเจธเจผ เจเจฐ เจธเจเจฆเฉ เจนเฉ, เจเจฆเฉเจ เจเจฟ เจเจชเจญเฉเจเจคเจพ เจเจธเจฆเฉ เจ เจฃเจเจชเจฒเจฌเจงเจคเจพ เจจเฉเฉฐ เจงเจฟเจเจจ เจตเจฟเฉฑเจ เจจเจนเฉเจ เจฐเฉฑเจเจฆเจพเฅค เจเจชเจญเฉเจเจคเจพ เจ เจคเฉ เจเฉฐเจชเจจเฉ เจฆเฉ เจฆเฉเจฐเจฟเจธเจผเจเฉเจเฉเจฃ เจคเฉเจ, เจเจน เจธเจญ เจคเฉเจ เจตเจงเฉเจ เจธเฉฐเจญเจต เจคเฉเจจเจพเจคเฉ เจฆเฉเจฐเจฟเจธเจผ เจนเฉ เจเจฟเจเจเจเจฟ เจเจน เจจเจตเฉเจเจ เจตเจฟเจธเจผเฉเจธเจผเจคเจพเจตเจพเจ เจจเฉเฉฐ เจชเฉเจธเจผ เจเจฐเจจ เจ เจคเฉ เจฌเจเจธ เจจเฉเฉฐ เจฌเจฟเจจเจพเจ เจเจฟเจธเฉ เจฐเฉเจเจพเจตเจ เจฆเฉ เจนเฉฑเจฒ เจเจฐเจจ เจฆเฉ เจเจเจฟเจ เจฆเจฟเฉฐเจฆเจพ เจนเฉเฅค
เจเจธ เจจเฉเฉฐ เจเจฟเจตเฉเจ เจชเฉเจฐเจพเจชเจค เจเจฐเจจเจพ เจนเฉ? เจเฉฑเจฅเฉ เจเจ เจคเจฐเฉเจเฉ เจนเจจ, เจเจนเจจเจพเจ เจตเจฟเฉฑเจเฉเจ เจเฉฑเจ เจเจน เจนเฉ:
- เจคเฉเจนเจพเจกเฉ เจธเฉเจตเจพ เจฆเจพ เจธเฉฐเจธเจเจฐเจฃ เจจเฉฐเจฌเจฐ 1 เจคเฉเจจเจพเจค เจเจฐเฉ
- เจเฉฑเจ เจกเจพเจเจพเจฌเฉเจธ เจฎเจพเจเจเฉเจฐเฉเจธเจผเจจ เจเจฐเฉ
- เจธเฉฐเจธเจเจฐเจฃ #2 เจฆเฉ เจธเจฎเจพเจจเจพเจเจคเจฐ เจเจชเจฃเฉ เจธเฉเจตเจพ เจฆเฉ เจธเฉฐเจธเจเจฐเจฃ #1 เจจเฉเฉฐ เจคเฉเจจเจพเจค เจเจฐเฉ
- เจเจฟเจตเฉเจ เจนเฉ เจคเฉเจธเฉเจ เจฆเฉเจเจฆเฉ เจนเฉ เจเจฟ เจธเฉฐเจธเจเจฐเจฃ เจจเฉฐเจฌเจฐ 2 เจเฉฐเจฎ เจเจฐเจฆเจพ เจนเฉ เจเจฟเจตเฉเจ เจเจฟ เจเจน เจเจฐเจจเจพ เจเจพเจนเฉเจฆเจพ เจนเฉ, เจธเฉฐเจธเจเจฐเจฃ เจจเฉฐ. 1 เจจเฉเฉฐ เจนเจเจพ เจฆเจฟเจ
- เจคเจฟเจเจฐ เจนเฉ!
เจเจธเจพเจจ, เจนเฉ เจจเจพ? เจฌเจฆเจเจฟเจธเจฎเจคเฉ เจจเจพเจฒ, เจเจน เจเฉฐเจจเจพ เจธเฉเจเจพ เจจเจนเฉเจ เจนเฉ, เจ เจคเฉ เจ เจธเฉเจ เจเจธเจจเฉเฉฐ เจฌเจพเจ เจฆ เจตเจฟเฉฑเจ เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจ เจฆเฉเจเจพเจเจเฉเฅค เจเจ เจนเฉเจฃ เจเฉฑเจ เจนเฉเจฐ เจเจพเจซเจผเฉ เจเจฎ เจคเฉเจจเจพเจคเฉ เจชเฉเจฐเจเจฟเจฐเจฟเจ เจฆเฉ เจเจพเจเจ เจเจฐเฉเจ - blue green deployment.
เจเฉ เจคเฉเจธเฉเจ เจเจฆเฉ เจเจธ เจฌเจพเจฐเฉ เจธเฉเจฃเจฟเจ เจนเฉ
- เจฏเจเฉเจจเฉ เจฌเจฃเจพเจ เจเจฟ เจคเฉเจนเจพเจกเฉ เจเจคเจชเจพเจฆเจจ เจเฉเจก เจฆเฉเจเจ เจฆเฉ เจเจพเจชเฉเจเจ ("เจจเฉเจฒเจพ" เจ เจคเฉ "เจนเจฐเจพ") เจเฉฐเจฎ เจเจฐเจฆเฉเจเจ เจนเจจ;
- เจธเจพเจฐเฉ เจเฉเจฐเฉเจซเจฟเจ เจจเฉเฉฐ เจจเฉเจฒเฉ เจตเจพเจคเจพเจตเจฐเจฃ เจตเฉฑเจฒ เจญเฉเจเฉ, เจเจฟเจตเฉเจ เจเจฟ เจคเจพเจ เจเจฟ เจเจคเจชเจพเจฆเจจ URL เจเฉฑเจฅเฉ เจเจธเจผเจพเจฐเจพ เจเจฐเจฆเฉ เจนเจจ;
- เจเฉฑเจ เจนเจฐเฉ เจตเจพเจคเจพเจตเจฐเจฃ เจตเจฟเฉฑเจ เจธเจพเจฐเฉเจเจ เจเจชเจฒเฉเจเฉเจธเจผเจจ เจคเจฌเจฆเฉเจฒเฉเจเจ เจฆเฉ เจคเจพเจเจจเจพเจคเฉ เจ เจคเฉ เจเจพเจเจ เจเจฐเฉ;
- เจฏเฉเจเจฐเจเจฒ เจจเฉเฉฐ เจจเฉเจฒเฉ เจคเฉเจ เจนเจฐเฉ เจตเจพเจคเจพเจตเจฐเจจ เจตเจฟเฉฑเจ เจฌเจฆเจฒเฉ
เจฌเจฒเฉ เจเฉเจฐเฉเจจ เจกเจฟเจชเจฒเจพเจเจฎเฉเจเจ เจเฉฑเจ เจ เจเจฟเจนเฉ เจชเจนเฉเฉฐเจ เจนเฉ เจเฉ เจคเฉเจนเจพเจจเฉเฉฐ เจเจคเจชเจพเจฆเจจ เจคเฉเฉเจจ เจฆเฉ เจเจฟเฉฐเจคเจพ เจเฉเจคเฉ เจฌเจฟเจจเจพเจ เจเจธเจพเจจเฉ เจจเจพเจฒ เจจเจตเฉเจเจ เจตเจฟเจธเจผเฉเจธเจผเจคเจพเจตเจพเจ เจชเฉเจธเจผ เจเจฐเจจ เจฆเฉ เจเจเจพเจเจผเจค เจฆเจฟเฉฐเจฆเฉ เจนเฉเฅค เจเจน เจเจธ เจคเฉฑเจฅ เจฆเฉ เจเจพเจฐเจจ เจนเฉ เจเจฟ เจญเจพเจตเฉเจ เจเฉเจ เจตเจพเจชเจฐเจฆเจพ เจนเฉ, เจคเฉเจธเฉเจ เจเจธเจพเจจเฉ เจจเจพเจฒ "เจเฉฑเจ เจธเจตเจฟเฉฑเจ เจซเจฒเจฟเฉฑเจ" เจเจฐเจเฉ เจชเจฟเจเจฒเฉ เจตเจพเจคเจพเจตเจฐเจฃ เจตเจฟเฉฑเจ เจตเจพเจชเจธ เจ เจธเจเจฆเฉ เจนเฉเฅค
เจเจชเจฐเฉเจเจค เจธเจญ เจจเฉเฉฐ เจชเฉเฉเจนเจจ เจคเฉเจ เจฌเจพเจ เจฆ, เจคเฉเจธเฉเจ เจเจน เจธเจตเจพเจฒ เจชเฉเฉฑเจ เจธเจเจฆเฉ เจนเฉ: เจเจผเฉเจฐเฉ เจกเจพเจเจจเจเจพเจเจฎ เจฆเจพ เจฌเจฒเฉ เจเฉเจฐเฉเจจ เจกเจฟเจชเจฒเจพเจเจฎเฉเจเจ เจจเจพเจฒ เจเฉ เจธเจฌเฉฐเจง เจนเฉ?
เจเฉเจฐ, เจเจนเจจเจพเจ เจตเจฟเฉฑเจ เจฌเจนเฉเจค เจเฉเจ เจธเจพเจเจเจพ เจนเฉ, เจเจฟเจเจเจเจฟ เจเฉฑเจเฉ เจตเจพเจคเจพเจตเจฐเจฃ เจฆเฉเจเจ เจฆเฉ เจเจพเจชเฉเจเจ เจจเฉเฉฐ เจฌเจฃเจพเจ เจฐเฉฑเจเจฃ เจฒเจ เจเจนเจจเจพเจ เจจเฉเฉฐ เจฌเจฃเจพเจ เจฐเฉฑเจเจฃ เจฒเจ เจฆเฉเฉฑเจเจฃเฉ เจเฉเจธเจผเจฟเจธเจผ เจฆเฉ เจฒเฉเฉ เจนเฉเฉฐเจฆเฉ เจนเฉเฅค เจเจธ เจฒเจ เจเฉเจ เจเฉเจฎเจพเจ เจฆเจพเจ
เจตเจพ เจเจฐเจฆเฉเจเจ เจนเจจ
เจเฉฑเจ เจนเฉเจฐ เจตเจฟเจเจฒเจช เจตเฉเฉฑเจฌ เจ เจคเฉ เจกเฉเจฎเฉเจจ เจฒเฉเจ เจฐเจพเจ เจฒเจ เจจเฉเจฒเฉ-เจนเจฐเฉ เจธเจตเจฟเฉฑเจเจพเจ เจจเฉเฉฐ เจฌเจฃเจพเจเจฃเจพ, เจเจธเฉ เจกเฉเจเจพเจฌเฉเจธ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจเจพ เจนเฉเฅค เจเจธ เจชเจนเฉเฉฐเจ เจตเจฟเฉฑเจ, เจกเฉเจเจพเจฌเฉเจธ เจตเจฟเฉฑเจ เจ เจเจธเจฐ เจเฉฑเจ เจธเจฎเฉฑเจธเจฟเจ เจนเฉ เจธเจเจฆเฉ เจนเฉ, เจเจพเจธ เจเจฐเจเฉ เจเจฆเฉเจ เจคเฉเจนเจพเจจเฉเฉฐ เจธเฉเจซเจเจตเฉเจ เจฐ เจฆเฉ เจเฉฑเจ เจจเจตเฉเจ เจธเฉฐเจธเจเจฐเจฃ เจฆเจพ เจธเจฎเจฐเจฅเจจ เจเจฐเจจ เจฒเจ เจเจธเจฆเฉ เจธเจเฉเจฎเจพ เจจเฉเฉฐ เจฌเจฆเจฒเจฃ เจฆเฉ เจฒเฉเฉ เจนเฉเฉฐเจฆเฉ เจนเฉเฅค
เจ เจคเฉ เจเฉฑเจฅเฉ เจ เจธเฉเจ เจเจธ เจฒเฉเจ เจตเจฟเฉฑเจ เจฎเฉเฉฑเจ เจธเจฎเฉฑเจธเจฟเจ เจตเฉฑเจฒ เจเจเจเจฆเฉ เจนเจพเจ. เจกเจพเจเจพเจฌเฉเจธ. เจเจ เจเจธ เจตเจพเจเฉฐเจธเจผ เจเฉฑเจคเฉ เจเฉฑเจ เจนเฉเจฐ เจจเจเจผเจฐ เจฎเจพเจฐเฉเจเฅค
เจเฉฑเจ เจกเจพเจเจพเจฌเฉเจธ เจฎเจพเจเจเฉเจฐเฉเจธเจผเจจ เจเจฐเฉ.
เจนเฉเจฃ เจคเฉเจนเจพเจจเฉเฉฐ เจเจชเจฃเฉ เจเจช เจคเฉเจ เจเจน เจธเจตเจพเจฒ เจชเฉเฉฑเจเจฃเจพ เจชเจเจเจพ - เจเฉ เจกเฉเจเจพเจฌเฉเจธ เจคเจฌเจฆเฉเจฒเฉ เจชเจฟเฉฑเจเฉ เจตเฉฑเจฒ เจ เจจเฉเจเฉเจฒ เจจเจนเฉเจ เจนเฉ เจคเจพเจ เจเฉ เจนเฉเจตเฉเจเจพ? เจเฉ เจเจช เจฆเจพ เจฎเฉเจฐเจพ เจชเจนเจฟเจฒเจพ เจธเฉฐเจธเจเจฐเจฃ เจฌเจฐเฉเจ เจจเจนเฉเจ เจนเฉเจตเฉเจเจพ? เจตเจพเจธเจคเจต เจตเจฟเฉฑเจ, เจเจน เจฌเจฟเจฒเจเฉเจฒ เจ เจเจฟเจนเจพ เจนเฉ เจนเฉเจตเฉเจเจพ ...
เจเจธ เจฒเจ, เจเจผเฉเจฐเฉ เจกเจพเจเจจเจเจพเจเจฎ/เจจเฉเจฒเฉ เจนเจฐเฉ เจคเฉเจจเจพเจคเฉ เจฆเฉ เจตเฉฑเจกเฉ เจฒเจพเจญเจพเจ เจฆเฉ เจจเจพเจฒ, เจเฉฐเจชเจจเฉเจเจ เจเจชเจฃเฉเจเจ เจเจชเจฒเฉเจเฉเจธเจผเจจเจพเจ เจจเฉเฉฐ เจคเฉเจจเจพเจค เจเจฐเจจ เจฒเจ เจนเฉเจ เจพเจ เจฆเจฟเฉฑเจคเฉ เจธเฉเจฐเฉฑเจเจฟเจ เจค เจชเฉเจฐเจเจฟเจฐเจฟเจ เจฆเฉ เจชเจพเจฒเจฃเจพ เจเจฐเจฆเฉเจเจ เจนเจจ:
- เจเจชเจฒเฉเจเฉเจธเจผเจจ เจฆเฉ เจจเจตเฉเจ เจธเฉฐเจธเจเจฐเจฃ เจฆเฉ เจจเจพเจฒ เจเฉฑเจ เจชเฉเจเฉเจ เจคเจฟเจเจฐ เจเจฐเฉ
- เจเฉฑเจฒ เจฐเจนเฉ เจเจชเจฒเฉเจเฉเจธเจผเจจ เจจเฉเฉฐ เจฌเฉฐเจฆ เจเจฐเฉ
- เจกเจพเจเจพเจฌเฉเจธ เจจเฉเฉฐ เจฎเจพเจเจเจฐเฉเจ เจเจฐเจจ เจฒเจ เจธเจเฉเจฐเจฟเจชเจเจพเจ เจเจฒเจพเจ
- เจเจชเจฒเฉเจเฉเจธเจผเจจ เจฆเจพ เจจเจตเจพเจ เจธเฉฐเจธเจเจฐเจฃ เจคเฉเจจเจพเจค เจ เจคเฉ เจฒเจพเจเจ เจเจฐเฉ
เจเจธ เจฒเฉเจ เจตเจฟเฉฑเจ, เจ เจธเฉเจ เจตเจฟเจธเจคเจพเจฐ เจฆเฉเจตเจพเจเจเฉ เจเจฟ เจคเฉเจธเฉเจ เจเจผเฉเจฐเฉ เจกเจพเจเจจเจเจพเจเจฎ เจคเฉเจจเจพเจคเฉ เจฆเจพ เจฒเจพเจญ เจฒเฉเจฃ เจฒเจ เจเจชเจฃเฉ เจกเฉเจเจพเจฌเฉเจธ เจ เจคเฉ เจเฉเจก เจจเจพเจฒ เจเจฟเจตเฉเจ เจเฉฐเจฎ เจเจฐ เจธเจเจฆเฉ เจนเฉเฅค
เจกเจพเจเจพเจฌเฉเจธ เจฎเฉเฉฑเจฆเฉ
เจเฉเจเจฐ เจคเฉเจนเจพเจกเฉ เจเฉเจฒ เจธเจเฉเจเจฒเฉเฉฑเจธ เจเจชเจฒเฉเจเฉเจธเจผเจจ เจนเฉ เจเฉ เจกเฉเจเจพเจฌเฉเจธ เจตเจฟเฉฑเจ เจเฉเจ เจกเจพเจเจพ เจธเจเฉเจฐ เจจเจนเฉเจ เจเจฐเจฆเฉ เจนเฉ, เจคเจพเจ เจคเฉเจธเฉเจ เจคเฉเจฐเฉฐเจค เจเจผเฉเจฐเฉ เจกเจพเจเจจเจเจพเจเจฎ เจคเฉเจจเจพเจคเฉ เจชเฉเจฐเจพเจชเจค เจเจฐ เจธเจเจฆเฉ เจนเฉเฅค เจฌเจฆเจเจฟเจธเจฎเจคเฉ เจจเจพเจฒ, เจเจผเจฟเจเจฆเจพเจคเจฐ เจธเฉเจซเจเจตเฉเจ เจฐ เจจเฉเฉฐ เจเจฟเจคเฉ เจกเจพเจเจพ เจธเจเฉเจฐ เจเจฐเจจ เจฆเฉ เจฒเฉเฉ เจนเฉเฉฐเจฆเฉ เจนเฉเฅค เจเจธ เจฒเจ เจคเฉเจนเจพเจจเฉเฉฐ เจธเจฐเจเจ เจตเจฟเฉฑเจ เจเฉเจ เจตเฉ เจฌเจฆเจฒเจพเจ เจเจฐเจจ เจคเฉเจ เจชเจนเจฟเจฒเจพเจ เจฆเฉ เจตเจพเจฐ เจธเฉเจเจฃเจพ เจเจพเจนเฉเจฆเจพ เจนเฉเฅค เจเจธ เจคเฉเจ เจชเจนเจฟเจฒเจพเจ เจเจฟ เจ เจธเฉเจ เจธเจเฉเจฎเจพ เจจเฉเฉฐ เจเจฟเจตเฉเจ เจฌเจฆเจฒเจฃเจพ เจนเฉ เจเจธ เจฆเฉ เจตเฉเจฐเจตเจฟเจเจ เจตเจฟเฉฑเจ เจเจพเจฃ เจคเฉเจ เจชเจนเจฟเจฒเจพเจ เจคเจพเจ เจเจฟ เจจเฉ-เจกเจพเจเจจเจเจพเจเจฎ เจคเฉเจจเจพเจคเฉ เจธเฉฐเจญเจต เจนเฉเจตเฉ, เจเจ เจชเจนเจฟเจฒเจพเจ เจตเจฐเจเจจเจฟเฉฐเจ เจธเจเฉเจฎเจพ 'เจคเฉ เจงเจฟเจเจจ เจฆเฉเจเจเฅค
เจตเจฐเจเจจเจฟเฉฐเจ เจธเจเฉเจฎ
เจเจธ เจฒเฉเจ เจตเจฟเจ เจ
เจธเฉเจ เจตเจฐเจคเจพเจเจเฉ 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 เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐ เจธเจเจฆเฉ เจนเฉ เจเจฟ เจคเฉเจนเจพเจกเฉ เจกเฉเจเจพเจฌเฉเจธ เจจเฉเฉฐ เจเจฟเจตเฉเจ เจธเฉเจงเจฟเจ เจเจพเจฃเจพ เจเจพเจนเฉเจฆเจพ เจนเฉเฅค เจธเจชเจฐเจฟเฉฐเจ เจฌเฉเจ เจ
เจคเฉ เจซเจฒเจพเจเจตเฉ เจฌเจพเจฐเฉ เจนเฉเจฐ เจเจพเจฃเจเจพเจฐเฉ เจฒเจ, เจเฉเฉฑเจ เจเจเจ เจเจฐเฉ
เจธเจชเจฐเจฟเฉฐเจ เจฌเฉเจ เจฆเฉ เจจเจพเจฒ เจเฉฑเจ เจธเจฐเฉเจค เจจเจฟเจฏเฉฐเจคเจฐเจฃ เจเฉเจฒ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ, เจคเฉเจนเจพเจจเฉเฉฐ 2 เจตเฉฑเจกเฉ เจฒเจพเจญ เจชเฉเจฐเจพเจชเจค เจนเฉเฉฐเจฆเฉ เจนเจจ:
- เจคเฉเจธเฉเจ เจกเฉเจเจพเจฌเฉเจธ เจคเจฌเจฆเฉเจฒเฉเจเจ เจจเฉเฉฐ เจเฉเจก เจคเจฌเจฆเฉเจฒเฉเจเจ เจคเฉเจ เจตเฉฑเจ เจเจฐเจฆเฉ เจนเฉ
- เจกเฉเจเจพเจฌเฉเจธ เจฎเจพเจเจเฉเจฐเฉเจธเจผเจจ เจคเฉเจนเจพเจกเฉ เจเจชเจฒเฉเจเฉเจธเจผเจจ เจฆเฉ เจฐเฉเจฒเจเจเจ เจฆเฉ เจจเจพเจฒ เจนเฉเฉฐเจฆเจพ เจนเฉ, เจเจฟเจตเฉเจ เจเจฟ เจคเฉเจนเจพเจกเฉ เจคเฉเจจเจพเจคเฉ เจชเฉเจฐเจเจฟเจฐเจฟเจ เจจเฉเฉฐ เจธเจฐเจฒ เจฌเจฃเจพเจเจ เจเจฟเจ เจนเฉ
เจกเจพเจเจพเจฌเฉเจธ เจธเจฎเฉฑเจธเจฟเจเจตเจพเจ เจฆเจพ เจจเจฟเจชเจเจพเจฐเจพ เจเจฐเจจเจพ
เจฒเฉเจ เจฆเฉ เจ เจเจฒเฉ เจญเจพเจ เจตเจฟเฉฑเจ, เจ เจธเฉเจ เจกเฉเจเจพเจฌเฉเจธ เจคเจฌเจฆเฉเจฒเฉเจเจ เจฒเจ เจฆเฉ เจชเจนเฉเฉฐเจเจพเจ เจจเฉเฉฐ เจฆเฉเจเจฃ 'เจคเฉ เจงเจฟเจเจจ เจเฉเจเจฆเจฐเจฟเจค เจเจฐเจพเจเจเฉเฅค
- เจชเจฟเจเจฒเจพ เจ เจธเฉฐเจเจคเจคเจพ
- เจชเจฟเฉฑเจเฉ เจ เจจเฉเจเฉเจฒเจคเจพ
เจชเจนเจฟเจฒเฉ เจจเฉเฉฐ เจเฉฑเจ เจเฉเจคเจพเจตเจจเฉ เจตเจเฉเจ เจฎเฉฐเจจเจฟเจ เจเจพเจตเฉเจเจพ เจเจฟ เจคเฉเจนเจพเจจเฉเฉฐ เจฎเฉเฉฑเจขเจฒเฉ เจคเจฟเจเจฐเฉ เจคเฉเจ เจฌเจฟเจจเจพเจ เจเจผเฉเจฐเฉ เจกเจพเจเจจเจเจพเจเจฎ เจคเฉเจจเจพเจคเฉ เจจเจนเฉเจ เจเจฐเจจเฉ เจเจพเจนเฉเจฆเฉ... เจฆเฉเจเจพ เจเฉฑเจ เจนเฉฑเจฒ เจชเฉเจธเจผ เจเจฐเจฆเจพ เจนเฉ เจเจฟ เจคเฉเจธเฉเจ เจฌเจฟเจจเจพเจ เจกเจพเจเจจเจเจพเจเจฎ เจฆเฉ เจคเฉเจจเจพเจคเฉ เจเจฟเจตเฉเจ เจเจฐ เจธเจเจฆเฉ เจนเฉ เจ เจคเฉ เจเจธเฉ เจธเจฎเฉเจ เจชเจฟเจเฉเฉ เจ เจจเฉเจเฉเจฒเจคเจพ เจจเฉเฉฐ เจเจพเจเจฎ เจฐเฉฑเจ เจธเจเจฆเฉ เจนเฉเฅค
เจธเจพเจกเจพ เจชเฉเจฐเฉเจเฉเจเจ เจเจฟเจธ 'เจคเฉ เจ
เจธเฉเจ เจเฉฐเจฎ เจเจฐ เจฐเจนเฉ เจนเจพเจ เจเจน เจเฉฑเจ เจธเจงเจพเจฐเจจ เจธเจชเจฐเจฟเฉฐเจ เจฌเฉเจ เจซเจฒเจพเจเจตเฉ เจเจชเจฒเฉเจเฉเจธเจผเจจ เจนเฉเจตเฉเจเฉ เจเจฟเจธ เจตเจฟเฉฑเจ เจนเฉ Person
ั first_name
ะธ last_name
เจกเจพเจเจพเจฌเฉเจธ เจตเจฟเฉฑเจ (เจฒเจเจญเจ เจ
เจจเฉเจตเจพเจฆ: Person
เจเฉฑเจ เจธเจพเจฐเจฃเฉ เจนเฉ เจ
เจคเฉ first_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
เจเจฟเฉฑเจชเจฃเฉ
เจฎเฉเจเฉเจฆเจพ เจคเจฌเจฆเฉเจฒเฉเจเจ เจธเจพเจจเฉเฉฐ เจเฉฑเจเฉ เจธเจฎเฉเจ เจฆเฉ เจเจฆเจพเจนเจฐเจจเจพเจ (เจชเฉเจฐเจพเจฃเฉ เจ เจคเฉ เจจเจตเฉเจ) เจเจฒเจพเจเจฃ เจฆเฉ เจเจเจพเจเจผเจค เจจเจนเฉเจ เจฆเจฟเฉฐเจฆเฉเจเจเฅค เจเจธ เจคเจฐเฉเจนเจพเจ, เจเจผเฉเจฐเฉ เจกเจพเจเจจเจเจพเจเจฎ เจคเฉเจจเจพเจคเฉ เจจเฉเฉฐ เจชเฉเจฐเจพเจชเจค เจเจฐเจจเจพ เจฎเฉเจธเจผเจเจฒ เจนเฉเจตเฉเจเจพ (เจเฉ เจงเจพเจฐเจจเจพเจตเจพเจ เจจเฉเฉฐ เจงเจฟเจเจจ เจตเจฟเฉฑเจ เจฐเฉฑเจเจฟเจ เจเจพเจเจฆเจพ เจนเฉ, เจเจน เจ เจธเจฒ เจตเจฟเฉฑเจ เจ เจธเฉฐเจญเจต เจนเฉ)เฅค
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 เจคเฉเจจเจพเจคเฉ เจเจฐเจจ เจฆเฉ เจเฉเจธเจผเจฟเจธเจผ เจเจฐเจจ เจคเฉเจ เจฌเจพเจ
เจฆ (เจฒเจเจญเจ เจชเฉเจฐเจคเฉ.: เจฒเฉเจเจ เจฆเจพ เจฎเจคเจฒเจฌ เจธเจผเจพเจเจฆ เจ/เจฌเฉ เจเฉเจธเจเจฟเฉฐเจ เจนเฉ) เจ
เจธเฉเจ เจซเฉเจธเจฒเจพ เจเฉเจคเจพ เจนเฉ เจเจฟ เจธเจพเจจเฉเฉฐ เจเจชเจฒเฉเจเฉเจธเจผเจจ เจจเฉเฉฐ เจตเจฐเจเจจ 'เจคเฉ เจตเจพเจชเจธ เจฒเจฟเจเจเจฃ เจฆเฉ เจฒเฉเฉ เจนเฉ 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
. เจนเฉเจฃ เจคเฉเจนเจพเจกเจพ DB เจธเฉฐเจธเจเจฐเจฃv2
- เจคเฉเจ เจกเจพเจเจพ เจเจพเจชเฉ เจเจฐเฉ
last_name
ะฒsurname
. เจงเจฟเจเจจ เจฆเฉเจตเฉเจเจฟ เจเฉเจเจฐ เจคเฉเจนเจพเจกเฉ เจเฉเจฒ เจเจน เจฌเจนเฉเจค เจธเจพเจฐเจพ เจกเจพเจเจพ เจนเฉ, เจคเจพเจ เจคเฉเจนเจพเจจเฉเฉฐ เจฌเฉเจ เจฎเจพเจเจเฉเจฐเฉเจธเจผเจจ 'เจคเฉ เจตเจฟเจเจพเจฐ เจเจฐเจจเจพ เจเจพเจนเฉเจฆเจพ เจนเฉ! - เจเจน เจเฉเจก เจฒเจฟเจเฉ เจเจฟเฉฑเจฅเฉ เจเจน เจตเจฐเจคเฉ เจเจพเจเจฆเฉ เจนเจจ เจฆเฉเจตเฉเจ ะธ ะฝะพะฒัะนเจ
เจคเฉ เจชเฉเจฐเจพเจฃเจพ เจเจพเจฒเจฎ เจนเฉเจฃ เจคเฉเจนเจพเจกเจพ เจเจช เจธเฉฐเจธเจเจฐเจฃ
2.0.0
- เจเจพเจฒเจฎ เจคเฉเจ เจฎเฉเฉฑเจฒ เจชเฉเฉเจนเฉ
surname
, เจเฉเจเจฐ เจเจน เจจเจนเฉเจ เจนเฉnull
, เจเจพเจ l เจคเฉเจast_name
, เจเฉsurname
เจจเจนเฉ เจฆเฉฑเจธเจเจ. เจคเฉเจธเฉเจ เจฎเจฟเจเจพ เจธเจเจฆเฉ เจนเฉgetLastName()
เจเฉเจก เจคเฉเจ, เจเจฟเจเจเจเจฟ เจเจน เจเจเจเจชเฉเฉฑเจ เจเจฐเฉเจเจพnull
เจคเฉเจ เจคเฉเจนเจพเจกเฉ เจ เจฐเจเจผเฉ เจจเฉเฉฐ เจตเจพเจชเจธ เจเจฐเจจ เจตเฉเจฒเฉ3.0.0
เจจเฉเฉฐ2.0.0
.
เจเฉเจเจฐ เจคเฉเจธเฉเจ เจธเจชเจฐเจฟเฉฐเจ เจฌเฉเจ เจซเจฒเจพเจเจตเฉเจ
เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐ เจฐเจนเฉ เจนเฉ, เจคเจพเจ เจเจน เจฆเฉ เจเจฆเจฎ เจตเจฐเจเจจ เจธเจเจพเจฐเจเจ
เฉฑเจช เจฆเฉเจฐเจพเจจ เจเฉเจคเฉ เจเจพเจฃเจเฉ 2.0.0
เจเจชเจฒเฉเจเฉเจธเจผเจจเจพเจเฅค เจเฉเจเจฐ เจคเฉเจธเฉเจ เจกเจพเจเจพเจฌเฉเจธ เจธเฉฐเจธเจเจฐเจฃ เจธเฉฐเจฆ เจจเฉเฉฐ เจนเฉฑเจฅเฉเจ เจเจฒเจพเจเจเจฆเฉ เจนเฉ, เจคเจพเจ เจคเฉเจนเจพเจจเฉเฉฐ เจ
เจเจฟเจนเจพ เจเจฐเจจ เจฒเจ เจฆเฉ เจตเฉฑเจ-เจตเฉฑเจ เจเฉเจเจผเจพเจ เจเจฐเจจเฉเจเจ เจชเฉเจฃเจเฉเจเจ (เจชเจนเจฟเจฒเจพเจ db เจธเฉฐเจธเจเจฐเจฃ เจจเฉเฉฐ เจนเฉฑเจฅเฉเจ เจ
เฉฑเจชเจกเฉเจ เจเจฐเฉ เจ
เจคเฉ เจซเจฟเจฐ เจจเจตเฉเจ เจเจชเจฒเฉเจเฉเจธเจผเจจ เจจเฉเฉฐ เจฒเจพเจเฉ เจเจฐเฉ)เฅค
เจเจน เจฎเจนเฉฑเจคเจตเจชเฉเจฐเจฃ เจนเฉ. เจฏเจพเจฆ เจฐเฉฑเจเฉ เจเจฟ เจจเจตเจพเจ เจฌเจฃเจพเจเจ เจเจพเจฒเจฎ เจจเจนเฉเจ เจเจฐเจจเจพ เจเจพเจนเฉเจฆเจพ เจนเฉเจฃเจพ เจจเจนเฉเจ. เจเฉเจเจฐ เจคเฉเจธเฉเจ เจฐเฉเจฒเจฌเฉเจ เจเจฐเจฆเฉ เจนเฉ, เจคเจพเจ เจชเฉเจฐเจพเจฃเฉ เจเจชเจฒเฉเจเฉเจธเจผเจจ เจจเฉเฉฐ เจจเจตเฉเจ เจเจพเจฒเจฎ เจฌเจพเจฐเฉ เจจเจนเฉเจ เจชเจคเจพ เจนเฉ เจ เจคเฉ เจเจธ เจฆเฉเจฐเจพเจจ เจเจธเจจเฉเฉฐ เจธเจฅเจพเจชเจฟเจค เจจเจนเฉเจ เจเจฐเฉเจเจพ
Insert.
เจชเจฐ เจเฉ เจคเฉเจธเฉเจ เจเจธ เจฐเฉเจเจพเจตเจ เจจเฉเฉฐ เจเฉเฉเจฆเฉ เจนเฉ เจ เจคเฉ เจคเฉเจนเจพเจกเจพ เจกเฉ.เจฌเฉ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
.
เจซเจฒเจพเจเจตเฉ เจธเจฐเฉเจค เจธเจเฉเจฐเจฟเจชเจ:
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
l เจฆเฉ เจเฉฑเจ เจเจพเจชเฉ เจนเฉast_name
. (เจจเฉเจ: เจเจธ เจเจพเจฒเจฎ เจตเจฟเฉฑเจ เจเฉเจ null เจชเจพเจฌเฉฐเจฆเฉ เจจเจนเฉเจ เจนเฉเจฃเฉ เจเจพเจนเฉเจฆเฉ) - เจเจชเจฒเฉเจเฉเจธเจผเจจ เจธเฉฐเจธเจเจฐเจฃ เจฆเฉ เจคเฉเจจเจพเจคเฉ
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
).
เจตเจพเจงเฉ
เจกเจพเจเจพเจฌเฉเจธ เจฐเฉเจซเฉเจเจเจฐเจฟเฉฐเจ เจชเฉเจเจฐเจจ เจฒเจเจพเจคเจพเจฐ เจกเจฟเจฒเจฟเจตเจฐเฉ
เจธเจพเจกเฉ เจฌเจฒเฉเจ 'เจคเฉ เจนเฉเจฐ เจฒเฉเจ เจตเฉ เจชเฉเฉเจนเฉ:
เจเฉเจฌเจฐเจจเฉเจเจธ: เจธเจฟเจธเจเจฎ เจธเจฐเฉเจค เจชเฉเจฐเจฌเฉฐเจงเจจ เจจเฉเฉฐ เจเฉเจเจซเจฟเจเจฐ เจเจฐเจจเจพ เจเฉฐเจจเจพ เจฎเจนเฉฑเจคเจตเจชเฉเจฐเจจ เจเจฟเจเจ เจนเฉ? เจเฉเจเจเจจ เจชเจพเจเจชเจฒเจพเจเจจ - เจเฉเจฌเจฐเจจเฉเจเจธ-เจฆเฉเจธเฉ เจชเจพเจเจชเจฒเจพเจเจจเจพเจ Nginx เจฒเจ เจกเจพเจเจจเจพเจฎเจฟเจ เจฎเฉเจกเฉเจเจฒ เจฌเจฃเจพเจเจฃเจพ เจนเจพเจธเจผเฉเจเฉเจฐเจช เจเฉเจเจธเจฒ เจฆเฉ เจเฉเจฌเจฐเจจเฉเจเจธ เจ เจงเจฟเจเจพเจฐ เจฆเฉ เจเจพเจฃ-เจชเจเจพเจฃ เจ เจงเจฟเจเจพเจฐ เจฆเฉ เจจเจพเจฒ เจเจฒเจฟเจเจนเจพเจเจธ เจคเฉเจ เจฌเจฟเจจเจพเจ เจ เจงเจฟเจเจพเจฐ เจฆเฉ เจเจฒเจฟเฉฑเจเจนเจพเจเจธ เจตเจฟเฉฑเจ เจฎเจพเจเจเฉเจฐเฉเจธเจผเจจ เจเฉ เจนเฉเจเจ? Nginx เจตเฉเฉฑเจฌ เจธเจฐเจตเจฐ เจฆเฉ เจจเจพเจฒ เจฌเจธเฉฐเจค เจเจชเจฒเฉเจเฉเจธเจผเจจเจพเจ เจฆเฉ เจฌเจฒเฉ-เจเฉเจฐเฉเจจ เจกเจฟเจชเจฒเจพเจเจฎเฉเจเจ
เจธเจฐเฉเจค: www.habr.com