เบเบฒเบ™เบ™เบณเปƒเบŠเป‰เบชเบนเบ™เบเบฒเบ™เบขเบธเบ”เป€เบฎเบฑเบ”เบงเบฝเบ เปเบฅเบฐเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™

เบเบฒเบ™เบ™เบณเปƒเบŠเป‰เบชเบนเบ™เบเบฒเบ™เบขเบธเบ”เป€เบฎเบฑเบ”เบงเบฝเบ เปเบฅเบฐเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™

เบšเบปเบ”โ€‹เบ„เบงเบฒเบกโ€‹เบ™เบตเป‰โ€‹เบญเบฐโ€‹เบ—เบดโ€‹เบšเบฒเบโ€‹เปƒเบ™โ€‹เบฅเบฐโ€‹เบญเบฝเบ”โ€‹เบงเบดโ€‹เบ—เบตโ€‹เปเบเป‰โ€‹เป„เบ‚โ€‹เบšเบฑเบ™โ€‹เบซเบฒโ€‹เบ„เบงเบฒเบกโ€‹เป€เบ‚เบปเป‰เบฒโ€‹เบเบฑเบ™โ€‹เป„เบ”เป‰โ€‹เบ‚เบญเบ‡โ€‹เบ–เบฒเบ™โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เปƒเบ™โ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹. เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบšเบญเบเบ—เปˆเบฒเบ™เบงเปˆเบฒเบชเบดเปˆเบ‡เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เป€เบเบตเบ”เบ‚เบถเป‰เบ™เบเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบเบฒเบ™เบœเบฐเบฅเบดเบ”เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบ—เปˆเบฒเบ™เบžเบฐเบเบฒเบเบฒเบกเบ—เบตเปˆเบˆเบฐเบ™เปเบฒเปƒเบŠเป‰เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบเบฐเบเบฝเบกเป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบœเปˆเบฒเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบงเบปเบ‡เบˆเบญเบ™เบŠเบตเบงเบดเบ”เบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ—เบตเปˆเบ•เป‰เบญเบ‡เบšเปเปˆเบกเบตเป€เบงเบฅเบฒเบขเบธเบ”เป€เบฎเบฑเบ”เบงเบฝเบ (เบ›เบฐเบกเบฒเบ™ lane: เป€เบžเบตเปˆเบกเป€เบ•เบตเบก - เบšเปเปˆเบกเบตเป€เบงเบฅเบฒเบขเบธเบ”). เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ‚เบญเบ‡เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปเบกเปˆเบ™เบˆเบฐเบ™เปเบฒเปƒเบŠเป‰เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบšเปเปˆเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰เปƒเบ™เปเบšเบšเบ—เบตเปˆเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰เบเบฑเบšเบซเบผเบฑเบ‡.

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเปƒเบˆเบ•เบปเบงเบขเปˆเบฒเบ‡เบฅเบฐเบซเบฑเบ”เบˆเบฒเบเบšเบปเบ”เบ„เบงเบฒเบก, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบŠเบญเบเบซเบฒเบžเบงเบเป€เบ‚เบปเบฒเป„เบ”เป‰เบ—เบตเปˆ GitHub.

เบเบฒเบ™เบ™เปเบฒเบชเบฐเป€เบซเบ™เบต

เบเบฒเบ™เบ™เบณเปƒเบŠเป‰เบชเบนเบ™เบเบฒเบ™เบขเบธเบ”เป€เบฎเบฑเบ”เบงเบฝเบ

เบญเบฑเบ™เปƒเบ”เป€เบ›เบฑเบ™เบ„เบงเบฒเบกเบฅเบถเบเบฅเบฑเบš เบเบฒเบ™เบ™เบณเปƒเบŠเป‰เบชเบนเบ™เบเบฒเบ™เบขเบธเบ”เป€เบฎเบฑเบ”เบงเบฝเบ? เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบงเบปเป‰เบฒเป„เบ”เป‰เบงเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบ–เบทเบเบ™เปเบฒเป„เบ›เปƒเบŠเป‰เปƒเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบ—เบตเปˆเป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เปเบ™เบฐเบ™เปเบฒเป€เบงเบตเบŠเบฑเบ™เปƒเบซเบกเปˆเบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เปƒเบ™เบเบฒเบ™เบœเบฐเบฅเบดเบ”เป„เบ”เป‰เบขเปˆเบฒเบ‡เบชเปเบฒเป€เบฅเบฑเบ”เบœเบปเบ™, เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบœเบนเป‰เปƒเบŠเป‰เบšเปเปˆเป„เบ”เป‰เบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เบ„เบงเบฒเบกเบšเปเปˆเบกเบตเบ‚เบญเบ‡เบกเบฑเบ™. เบˆเบฒเบเบ—เบฑเบ”เบชเบฐเบ™เบฐเบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰เปเบฅเบฐเบšเปเบฅเบดเบชเบฑเบ”, เบ™เบตเป‰เปเบกเปˆเบ™เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”เบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เป€เบžเบฒเบฐเบงเปˆเบฒเบกเบฑเบ™เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ„เบธเบ™เบ™เบฐเบชเบปเบกเบšเบฑเบ”เปƒเบซเบกเปˆเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ™เปเบฒเบชเบฐเป€เบซเบ™เบตเปเบฅเบฐเบ‚เปเป‰เบšเบปเบเบžเปˆเบญเบ‡เบ—เบตเปˆเบˆเบฐเปเบเป‰เป„เบ‚เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบฅเบปเบšเบเบงเบ™.

เบงเบดเบ—เบตเบเบฒเบ™เบšเบฑเบ™เบฅเบธเบ™เบตเป‰? เบกเบตเบซเบผเบฒเบเบงเบดเบ—เบต, เบ™เบตเป‰เปเบกเปˆเบ™ เปœเบถเปˆเบ‡ เปƒเบ™เบ™เบฑเป‰เบ™:

  • เบ™เบณเปƒเบŠเป‰เบชเบฐเบšเบฑเบšเป€เบฅเบเบ—เบต 1 เบ‚เบญเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™
  • เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เบเป‰เบฒเบเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™
  • เบ™เบณเปƒเบŠเป‰เป€เบงเบตเบŠเบฑเปˆเบ™ #2 เบ‚เบญเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒเบ‚เบฐเปœเบฒเบ™เบเบฑเบšเป€เบงเบตเบŠเบฑเบ™ #1
  • เบ—เบฑเบ™เบ—เบตเบ—เบตเปˆเบ—เปˆเบฒเบ™เป€เบซเบฑเบ™เบงเปˆเบฒเบชเบฐเบšเบฑเบšเป€เบฅเบเบ—เบต 2 เป€เบฎเบฑเบ”เบงเบฝเบเบ•เบฒเบกเบ—เบตเปˆเบกเบฑเบ™เบ„เบงเบ™เบˆเบฐเป€เบ›เบฑเบ™, เป€เบญเบปเบฒเบชเบฐเบšเบฑเบšเป€เบฅเบเบ—เบต 1
  • เบชเบณ เป€เบฅเบฑเบ”เปเบฅเป‰เบง!

เบ‡เปˆเบฒเบ, เบšเปเปˆเปเบกเปˆเบ™เบšเป? เปเบ•เปˆเบซเบ™เป‰เบฒเป€เบชเบเบ”เบฒเบ, เบกเบฑเบ™เบšเปเปˆเปเบกเปˆเบ™เป€เบฅเบทเปˆเบญเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบ, เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบšเบดเปˆเบ‡เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เปƒเบ™เบžเบฒเบเบซเบผเบฑเบ‡. เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เบเบงเบ”เป€เบšเบดเปˆเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ™เบณเปƒเบŠเป‰เบ—เบปเปˆเบงเป„เบ›เบญเบตเบเบญเบฑเบ™เปœเบถเปˆเบ‡ - blue green deployment .

เป€เบˆเบปเป‰เบฒเป€เบ„เบตเบเป„เบ”เป‰เบเบดเบ™ เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เบชเบตโ€‹เบŸเป‰เบฒโ€‹เบชเบตโ€‹เบ‚เบฝเบงโ€‹? Cloud Foundry เป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบฑเบ™เบ‡เปˆเบฒเบเบ—เบตเปˆเบชเบธเบ”. เบžเบฝเบ‡เปเบ•เปˆเป€เบšเบดเปˆเบ‡ เบซเบปเบงโ€‹เบ‚เปเป‰โ€‹เบ™เบตเป‰, เบšเปˆเบญเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบ™เบตเป‰เปƒเบ™เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบก. เป€เบžเบทเปˆเบญเบชเบฐเบซเบผเบธเบšเป‚เบ”เบเบซเบเปเป‰, เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเป€เบ•เบทเบญเบ™เบ—เปˆเบฒเบ™เบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบชเบตเบ‚เบฝเบงเบชเบตเบŸเป‰เบฒ:

  • เปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบชเบญเบ‡เบชเปเบฒเป€เบ™เบปเบฒเบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เบเบฒเบ™เบœเบฐเบฅเบดเบ”เบ‚เบญเบ‡เบ—เปˆเบฒเบ™ ("เบชเบตเบŸเป‰เบฒ" เปเบฅเบฐ "เบชเบตเบ‚เบฝเบง") เป€เบฎเบฑเบ”เบงเบฝเบ;
  • เบŠเบตเป‰เบ™เปเบฒเบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เป„เบ›เบชเบนเปˆเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบชเบตเบŸเป‰เบฒ, i.e. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™ URLs เบเบฒเบ™เบœเบฐเบฅเบดเบ”เบŠเบตเป‰เปƒเบซเป‰เป€เบซเบฑเบ™;
  • เบ™เบณเปƒเบŠเป‰ เปเบฅเบฐเบ—เบปเบ”เบชเบญเบšเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ—เบฑเบ‡เปเบปเบ”เปƒเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบชเบตเบ‚เบฝเบง;
  • เบ›เปˆเบฝเบ™ urls เบˆเบฒเบเบชเบตเบŸเป‰เบฒเป€เบ›เบฑเบ™เบชเบตเบ‚เบฝเบงเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก

เบเบฒเบ™เบ™เบณเปƒเบŠเป‰เบชเบตเบ‚เบฝเบงเบชเบตเบŸเป‰เบฒเป€เบ›เบฑเบ™เบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เปเบ™เบฐเบ™เบณเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เปƒเปเปˆเป„เบ”เป‰เบขเปˆเบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบเป‚เบ”เบเบšเปเปˆเบ•เป‰เบญเบ‡เบเบฑเบ‡เบงเบปเบ™เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เปเบ•เบเปเบเบเบ‚เบญเบ‡เบเบฒเบ™เบœเบฐเบฅเบดเบ”. เบ™เบตเป‰เปเบกเปˆเบ™เป€เบ™เบทเปˆเบญเบ‡เบกเบฒเบˆเบฒเบเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เป€เบเบตเบ”เบ‚เบถเป‰เบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเบฑเบšเบ„เบทเบ™เบชเบนเปˆเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒเป„เบ”เป‰เบขเปˆเบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบเป‚เบ”เบเบžเบฝเบ‡เปเบ•เปˆ "flicking เบชเบฐเบซเบผเบฑเบš."

เบซเบผเบฑเบ‡เบˆเบฒเบเบญเปˆเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡, เป€เบˆเบปเป‰เบฒเบญเบฒเบ”เบˆเบฐเบ–เบฒเบกเบ„เปเบฒเบ–เบฒเบก: เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ—เบตเปˆเบšเปเปˆเบกเบตเบเบฒเบ™เบขเบธเบ”เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš Blue Green เปเบกเปˆเบ™เบซเบเบฑเบ‡?

เบ”เบต, เบžเบงเบเบกเบฑเบ™เบกเบตเบ„เบงเบฒเบกเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบซเบผเบฒเบ, เป€เบžเบฒเบฐเบงเปˆเบฒเบเบฒเบ™เบฎเบฑเบเบชเบฒเบชเบญเบ‡เบชเปเบฒเป€เบ™เบปเบฒเบ‚เบญเบ‡เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบ”เบฝเบงเบเบฑเบ™เบฎเบฝเบเบฎเป‰เบญเบ‡เปƒเบซเป‰เบกเบตเบ„เบงเบฒเบกเบžเบฐเบเบฒเบเบฒเบกเบชเบญเบ‡เป€เบ—เบปเปˆเบฒเป€เบžเบทเปˆเบญเบฎเบฑเบเบชเบฒเบžเบงเบเบกเบฑเบ™. เบ™เบตเป‰เปเบกเปˆเบ™เป€เบซเบ”เบœเบปเบ™เบ—เบตเปˆเบ—เบตเบกเบ‡เบฒเบ™เบšเบฒเบ‡เบ„เบปเบ™เบญเป‰เบฒเบ‡ Martin Fowler, เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบกเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰:

เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบญเบทเปˆเบ™เปเบกเปˆเบ™เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ”เบฝเบงเบเบฑเบ™, เบเบฒเบ™เบชเป‰เบฒเบ‡เบชเบฐเบซเบผเบฑเบšเบชเบตเบŸเป‰เบฒเบชเบตเบ‚เบฝเบงเบชเปเบฒเบฅเบฑเบšเบŠเบฑเป‰เบ™เป€เบงเบฑเบšเปเบฅเบฐเป‚เบ”เป€เบกเบ™. เปƒเบ™เบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰, เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบกเบฑเบเบˆเบฐเป€เบ›เบฑเบ™เบšเบฑเบ™เบซเบฒ, เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡ schema เบ‚เบญเบ‡เบ•เบปเบ™เป€เบžเบทเปˆเบญเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบชเบฐเบšเบฑเบšเปƒเบซเบกเปˆเบ‚เบญเบ‡เบŠเบญเบšเปเบง.

เปเบฅเบฐเปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบกเบฒเบฎเบญเบ”เบšเบฑเบ™เบซเบฒเบ•เบปเป‰เบ™เบ•เปเปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰. เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™. เบฅเบญเบ‡เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเป€เบšเบดเปˆเบ‡เบ›เบฐเป‚เบซเบเบเบ™เบตเป‰เบญเบตเบ.

เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เบเป‰เบฒเบเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™.

เบ•เบญเบ™เบ™เบตเป‰เป€เบˆเบปเป‰เบฒเบ•เป‰เบญเบ‡เบ–เบฒเบกเบ•เบปเบงเป€เบญเบ‡เบงเปˆเบฒ - เบˆเบฐเป€เบฎเบฑเบ”เปเบ™เบงเปƒเบ”เบ–เป‰เบฒเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบšเปเปˆเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰เบเบฑเบšเบซเบฅเบฑเบ‡? เปเบญเบฑเบšเป€เบงเบตเบŠเบฑเปˆเบ™เบ—เบณเบญเบดเบ”เบ‚เบญเบ‡เบ‚เป‰เบญเบเบˆเบฐเบšเปเปˆเบขเบธเบ”เบšเป? เปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡, เบ™เบตเป‰เปเบกเปˆเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™ ...

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบˆเบฐเบกเบตเบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เบญเบฑเบ™เปƒเบซเบเปˆเบซเบผเบงเบ‡เบ‚เบญเบ‡เบเบฒเบ™เปƒเบŠเป‰เบชเบนเบ™เบเบฒเบ™เบขเบธเบ”เป€เบฎเบฑเบ”เบงเบฝเบ / เบชเบตเบ‚เบฝเบงเบชเบตเบŸเป‰เบฒ, เบšเปเบฅเบดเบชเบฑเบ”เบกเบตเปเบ™เบงเป‚เบ™เป‰เบกเบ—เบตเปˆเบˆเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบกเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ—เบตเปˆเบ›เบญเบ”เป„เบžเบเบงเปˆเบฒเบ•เปเปˆเป„เบ›เบ™เบตเป‰เป€เบžเบทเปˆเบญเบ™เปเบฒเปƒเบŠเป‰เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ:

  • เบเบฐเบเบฝเบกเบŠเบธเบ”เบ—เบตเปˆเบกเบตเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบชเบฐเบšเบฑเบšเปƒเบซเบกเปˆ
  • เบ›เบดเบ”เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆ
  • เปเบฅเปˆเบ™เบชเบฐเบ„เบฃเบดเบšเป€เบžเบทเปˆเบญเบเป‰เบฒเบเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™
  • เบ™เบณเปƒเบŠเป‰ เปเบฅเบฐเป€เบ›เบตเบ”เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เป€เบงเบตเบŠเบฑเบ™เปƒเปเปˆ

เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบญเบฐเบ—เบดเบšเบฒเบเบงเบดเบ—เบตเบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™ เปเบฅเบฐเบฅเบฐเบซเบฑเบ”เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป€เบžเบทเปˆเบญเปƒเบŠเป‰เบ›เบฐเป‚เบซเบเบ”เบˆเบฒเบเบเบฒเบ™เบ™เบณเปƒเบŠเป‰เบชเบนเบ™เบเบฒเบ™เบขเบธเบ”เป€เบฎเบฑเบ”เบงเบฝเบ.

เบšเบฑเบ™เบซเบฒเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบกเบตเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ—เบตเปˆเบšเปเปˆเบกเบตเบฅเบฑเบ”เบ—เบตเปˆเบšเปเปˆเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ‚เปเป‰เบกเบนเบ™เปƒเบ”เป†เปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบชเบนเบ™เบเบฒเบ™เบขเบธเบ”เป€เบฎเบฑเบ”เบงเบฝเบเบ—เบฑเบ™เบ—เบต. เปเบ•เปˆเบซเบ™เป‰เบฒเป€เบชเบเบ”เบฒเบ, เบŠเบญเบšเปเบงเบชเปˆเบงเบ™เปƒเบซเบเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ‚เปเป‰เบกเบนเบ™เบขเบนเปˆเบšเปˆเบญเบ™เปƒเบ”เบซเบ™เบถเปˆเบ‡. เบ™เบตเป‰เปเบกเปˆเบ™เป€เบซเบ”เบœเบปเบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เบ„เบงเบ™เบ„เบดเบ”เบชเบญเบ‡เบ„เบฑเป‰เบ‡เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เปƒเบ”เป†เบ•เปเปˆเบงเบปเบ‡เบˆเบญเบ™. เบเปˆเบญเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบ›เปˆเบฝเบ™ schema เป€เบžเบทเปˆเบญเบšเปเปˆเปƒเบซเป‰เบกเบตเบเบฒเบ™เบขเบธเบ”เป€เบงเบฅเบฒเป€เบฎเบฑเบ”เบงเบฝเบ, เบ—เปเบฒเบญเบดเบ”เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเป€เบญเบปเบฒเปƒเบˆเปƒเบชเปˆเบเบฑเบš schema เบชเบฐเบšเบฑเบš.

เป‚เบ„เบ‡โ€‹เบเบฒเบ™โ€‹เบชเบฐโ€‹เบšเบฑเบšโ€‹

เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเปƒเบŠเป‰ เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบšเบดเบ™ เป€เบ›เบฑเบ™โ€‹เป€เบ„เบทเปˆเบญเบ‡โ€‹เบกเบทโ€‹เบเบฒเบ™โ€‹เบ„เบงเบšโ€‹เบ„เบธเบกโ€‹เบชเบฐโ€‹เบšเบฑเบš (เบ›เบฐเบกเบฒเบ™ เบเบฒเบ™เปเบ›: เบžเบงเบเป€เบฎเบปเบฒเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เบเป‰เบฒเบเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™). เบ•เบฒเบกเบ—เปเบฒเบกเบฐเบŠเบฒเบ”, เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบˆเบฐเบ‚เบฝเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ Spring Boot เบ—เบตเปˆเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ Flyway เปƒเบ™เบ•เบปเบงเปเบฅเบฐเบˆเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เบเป‰เบฒเบ schema เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เบชเบฐเบžเบฒเบšเบเบฒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ. เป€เบกเบทเปˆเบญเปƒเบŠเป‰ Flyway, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบชเบฐเบ„เบดเบšเบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เบเป‰เบฒเบเปƒเบ™เป‚เบŸเบ™เป€เบ”เบตเป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™ (เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปƒเบ™ 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 Docs.

เป‚เบ”เบเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ„เบงเบšเบ„เบธเบกเปเบซเบผเปˆเบ‡เบเบฑเบš Spring Boot, เบ—เปˆเบฒเบ™เป„เบ”เป‰เบฎเบฑเบšเบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เบญเบฑเบ™เปƒเบซเบเปˆเบซเบผเบงเบ‡ 2:

  • เบ—เปˆเบฒเบ™เปเบเบเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบฅเบฐเบซเบฑเบ”
  • เบเบฒเบ™โ€‹เป€เบ„เบทเปˆเบญเบ™โ€‹เบเป‰เบฒเบโ€‹เบ–เบฒเบ™โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เป€เบเบตเบ”โ€‹เบ‚เบถเป‰เบ™โ€‹เบžเป‰เบญเบกโ€‹เบเบฑเบšโ€‹เบเบฒเบ™โ€‹เป€เบ›เบตเบ”โ€‹เบ•เบปเบงโ€‹เบ‚เบญเบ‡โ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹เบ‚เบญเบ‡โ€‹เบ—เปˆเบฒเบ™โ€‹, i.e. เบ‚เบฐโ€‹เบšเบงเบ™โ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เบ‚เบญเบ‡โ€‹เบ—เปˆเบฒเบ™โ€‹เปเบกเปˆเบ™โ€‹เบ‡เปˆเบฒเบโ€‹เบ”เบฒเบโ€‹

เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™

เปƒเบ™เบžเบฒเบเบ•เปเปˆเป„เบ›เบ‚เบญเบ‡เบšเบปเบ”เบ„เบงเบฒเบก, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบชเบธเบกเปƒเบชเปˆเบเบฒเบ™เป€เบšเบดเปˆเบ‡เบชเบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เปƒเบ™เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™.

  • เบ„เบงเบฒเบกเบšเปเปˆเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰เบเบฑเบšเบซเบผเบฑเบ‡
  • เบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰เบเบฑเบšเบซเบผเบฑเบ‡

เบญเบฑเบ™เบ—เปเบฒเบญเบดเบ”เบˆเบฐเบ–เบทเบเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเป€เบ›เบฑเบ™เบ„เปเบฒเป€เบ•เบทเบญเบ™เบงเปˆเบฒเบ—เปˆเบฒเบ™เบšเปเปˆเบ„เบงเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบงเบฒเบ‡เป€เบงเบฅเบฒ downtime เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบเบฐเบเบฝเบกเป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™ ... เบญเบฑเบ™เบ—เบตเบชเบญเบ‡เบชเบฐเป€เบซเบ™เบตเบงเบดเบ—เบตเปเบเป‰เป„เบ‚เบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ deployment เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™ downtime เปเบฅเบฐเปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™เบฎเบฑเบเบชเบฒเบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰เบเบฑเบšเบ„เบทเบ™เป„เบ›เบšเปˆเบญเบ™.

เป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบฎเบฑเบ”เบงเบฝเบเบˆเบฐเป€เบ›เบฑเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ Spring Boot Flyway เบ‡เปˆเบฒเบเบ”เบฒเบเบ—เบตเปˆเบกเบต Person ั first_name ะธ last_name เปƒเบ™โ€‹เบ–เบฒเบ™โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™ (เบ›เบฐเบกเบฒเบ™ เบเบฒเบ™เปเบ›: Person เปเบกเปˆเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปเบฅเบฐ first_name ะธ last_name - เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบ—เบปเปˆเบ‡เบ™เบฒเปƒเบ™เบกเบฑเบ™). เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบ›เปˆเบฝเบ™เบŠเบทเปˆ last_name ะฒ surname.

เบชเบปเบกเบกเบธเบ”เบ•เบดเบ–เบฒเบ™

เบเปˆเบญเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบฅเบฒเบเบฅเบฐเบญเบฝเบ”, เบกเบตเบชเบญเบ‡เบชเบปเบกเบกเบธเบ”เบ•เบดเบ–เบฒเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เป€เบฎเบฑเบ”เบเปˆเบฝเบงเบเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ. เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ•เบปเป‰เบ™เบ•เปเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเบšเบฑเบ™เบฅเบธเบˆเบฐเป€เบ›เบฑเบ™เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ‡เปˆเบฒเบเบ”เบฒเบเบžเบปเบšเบ—เบปเปˆเบงเป„เบ›.

เบšเบฑเบ™เบ—เบถเบ. เบ—เบธเบฅเบฐเบเบดเบ” PRO-TIP. เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ—เบตเปˆเบฅเบฝเบšเบ‡เปˆเบฒเบเบชเบฒเบกเบฒเบ”เบ›เบฐเบซเบเบฑเบ”เป€เบ‡เบดเบ™เปƒเบซเป‰เบ—เปˆเบฒเบ™เป„เบ”เป‰เบซเบผเบฒเบเปƒเบ™เบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ (เบซเบผเบฒเบเบ„เบปเบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบชเปเบฒเบฅเบฑเบšเบšเปเบฅเบดเบชเบฑเบ”เบ‚เบญเบ‡เบ—เปˆเบฒเบ™, เป€เบ‡เบดเบ™เบซเบผเบฒเบเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เบฐเบซเบเบฑเบ”เป„เบ”เป‰)!

เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡ rollback เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™

เบญเบฑเบ™เบ™เบตเป‰เป€เบฎเบฑเบ”เปƒเบซเป‰เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ™เบณเปƒเบŠเป‰เบ‡เปˆเบฒเบ (เบšเบฒเบ‡ rollback เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เป€เบเบทเบญเบšเป€เบ›เบฑเบ™เป„เบ›เบšเปเปˆเป„เบ”เป‰, เป€เบŠเบฑเปˆเบ™: เบเบฒเบ™เบฅเบถเบš rollback). เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบเบฑเบšเบ„เบทเบ™เบžเบฝเบ‡เปเบ•เปˆเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ. เบงเบดเบ—เบตเบ™เบตเป‰, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบ—เปˆเบฒเบ™เบกเบตเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™ (เบ•เบปเบงเบขเปˆเบฒเบ‡, SQL เปเบฅเบฐ NoSQL), เบ—เปเปˆเบเบฒเบ™เบ™เปเบฒเป„เบ›เปƒเบŠเป‰เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบˆเบฐเบกเบตเบฅเบฑเบเบชเบฐเบ™เบฐเบ”เบฝเบงเบเบฑเบ™.

เบกเบฑเบ™โ€‹เบ•เป‰เบญเบ‡โ€‹เป€เบ›เบฑเบ™โ€‹เป„เบ›โ€‹เป„เบ”เป‰โ€‹เบชเบฐโ€‹เป€เบซเบกเบตโ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เบเบฑเบšโ€‹เบ„เบทเบ™โ€‹เป„เบ›โ€‹เบšเปˆเบญเบ™โ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹เบซเบ™เบถเปˆเบ‡โ€‹เบชเบฐโ€‹เบšเบฑเบšโ€‹เบเบฑเบšโ€‹เบ„เบทเบ™โ€‹เป„เบ›โ€‹เบšเปˆเบญเบ™ (เบšเปเปˆโ€‹เบกเบตโ€‹เบ•เปเปˆโ€‹เป„เบ›โ€‹)

Rollback เบ„เบงเบ™เป€เบฎเบฑเบ”เป€เบกเบทเปˆเบญเบกเบตเบ„เบงเบฒเบกเบˆเปเบฒเป€เบ›เบฑเบ™เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™. เบ–เป‰เบฒเบกเบต bug เปƒเบ™เบชเบฐเบšเบฑเบšเบ›เบฐเบˆเบธเบšเบฑเบ™เบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เปเบเป‰เป„เบ‚เป„เบ”เป‰เบ‡เปˆเบฒเบ, เบžเบงเบเป€เบฎเบปเบฒเบ„เบงเบ™เบˆเบฐเบชเบฒเบกเบฒเบ”เบเบฑเบšเบ„เบทเบ™เป„เบ›เบชเบฐเบšเบฑเบšเบซเบฅเป‰เบฒเบชเบธเบ”เบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเป„เบ”เป‰. เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบชเบปเบกโ€‹เบกเบธเบ”โ€‹เบงเปˆเบฒโ€‹เบชเบฐโ€‹เบšเบฑเบšโ€‹เบ—เบตเปˆโ€‹เป€เบฎเบฑเบ”โ€‹เบงเบฝเบโ€‹เบซเบฅเป‰เบฒโ€‹เบชเบธเบ”โ€‹เบ™เบตเป‰โ€‹เปเบกเปˆเบ™โ€‹เบเบฒเบ™โ€‹เบ—เบตเปˆโ€‹เบœเปˆเบฒเบ™โ€‹เบกเบฒโ€‹. เบเบฒเบ™เบฎเบฑเบเบชเบฒเบฅเบฐเบซเบฑเบ”เปเบฅเบฐเบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰เบ‚เบญเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเบซเบผเบฒเบเบเบงเปˆเบฒเบซเบ™เบถเปˆเบ‡เบ„เบฑเป‰เบ‡เบˆเบฐเป€เบ›เบฑเบ™เบเบฒเบ™เบเบฒเบเบ—เบตเปˆเบชเบธเบ”เปเบฅเบฐเบกเบตเบฅเบฒเบ„เบฒเปเบžเบ‡.

เบšเบฑเบ™เบ—เบถเบ. เป€เบžเบทเปˆเบญเปƒเบซเป‰เบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เป„เบ”เป‰เบซเบผเบฒเบเบเบงเปˆเบฒเป€เบเบปเปˆเบฒ, เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ›เปˆเบฝเบ™เป€เบงเบตเบŠเบฑเบ™เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™.

เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เบต 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, deployed เปƒเบ™โ€‹เบเบฒเบ™โ€‹เบœเบฐโ€‹เบฅเบดเบ”โ€‹, เปเบฅเบฐโ€‹เบ–เบฒเบ™โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹ v1. เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบ™เปเบฒเปƒเบŠเป‰เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเบชเบญเบ‡เบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ, เบชเบฐเบšเบฑเบš 2.0.0.BAD, เปเบฅเบฐเบ›เบฑเบšเบ›เบธเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เป€เบ›เบฑเบ™ v2bad.

เบ‚เบฑเป‰เบ™เบ•เบญเบ™:

  1. เบ•เบปเบงเบขเปˆเบฒเบ‡เปƒเปเปˆเบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เป€เบงเบตเบŠเบฑเบ™เบ–เบทเบเบ™เบณเปƒเบŠเป‰ 2.0.0.BADเป€เบŠเบดเปˆเบ‡เบ›เบฑเบšเบ›เบธเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เป€เบ›เบฑเบ™ v2bad
  2. เปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™ v2bad เบ–เบฑเบ™ last_name เบšเปเปˆเบกเบตเปเบฅเป‰เบง - เบกเบฑเบ™เป„เบ”เป‰เบ–เบทเบเบ›เปˆเบฝเบ™เป€เบ›เบฑเบ™ surname
  3. เบเบฒเบ™เบญเบฑเบšเป€เบ”เบ”เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™ เปเบฅเบฐเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบชเบณเป€เบฅเบฑเบ”เบœเบปเบ™ เปเบฅเบฐเบšเบฒเบ‡เบเปเบฅเบฐเบ™เบตเบเบณเบฅเบฑเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆ 1.0.0, เบญเบทเปˆเบ™เป† - เปƒเบ™ 2.0.0.BAD. เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เปเบกเปˆเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™ v2bad
  4. เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เบชเบฐเบšเบฑเบš 1.0.0 เบˆเบฐเป€เบฅเบตเปˆเบกเบ–เบดเป‰เบกเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เป€เบžเบฒเบฐเบงเปˆเบฒเบžเบงเบเป€เบ‚เบปเบฒเบˆเบฐเบžเบฐเบเบฒเบเบฒเบกเปƒเบชเปˆเบ‚เปเป‰เบกเบนเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ–เบฑเบ™ last_nameเบœเบนเป‰เบ—เบตเปˆเบšเปเปˆเบกเบตเบขเบนเปˆเปเบฅเป‰เบง
  5. เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เบชเบฐเบšเบฑเบš 2.0.0.BAD เบˆเบฐเป€เบฎเบฑเบ”เบงเบฝเบเป‚เบ”เบเบšเปเปˆเบกเบตเบšเบฑเบ™เบซเบฒ

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เป€เบซเบฑเบ™เป„เบ”เป‰, เบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเป€เบฎเบฑเบ”เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ—เบตเปˆเบšเปเปˆเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เบเบฑเบšเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เปเบฅเบฐเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™, เบเบฒเบ™เบ—เบปเบ”เบชเบญเบš A / B เปเบกเปˆเบ™เป€เบ›เบฑเบ™เป„เบ›เบšเปเปˆเป„เบ”เป‰.

เบเบฒเบ™โ€‹เป€เบฅเบทเปˆเบญเบ™โ€‹เบ„เบทเบ™โ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹

เปƒเบซเป‰เบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเบซเบผเบฑเบ‡เบˆเบฒเบเบžเบฐเบเบฒเบเบฒเบกเปƒเบŠเป‰ A/B (เบ›เบฐเบกเบฒเบ™ per.: เบœเบนเป‰เบ‚เบฝเบ™เบญเบฒเบ”เบˆเบฐเบซเบกเบฒเบเป€เบ–เบดเบ‡เบเบฒเบ™เบ—เบปเบ”เบชเบญเบš A/B เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰) เบžเบงเบเป€เบฎเบปเบฒเบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบเบฑเบšเบ„เบทเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเป€เบ›เบฑเบ™เบชเบฐเบšเบฑเบš 1.0.0. เปƒเบซเป‰เป€เบงเบปเป‰เบฒเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™ rollback เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™.

เบ‚เบฑเป‰เบ™เบ•เบญเบ™:

  1. เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบขเบธเบ”โ€‹เป€เบŠเบปเบฒโ€‹เบเบฒเบ™โ€‹เบ•เบปเบงโ€‹เบขเปˆเบฒเบ‡โ€‹เบ‚เบญเบ‡โ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹เบชเบฐโ€‹เบšเบฑเบšโ€‹ 2.0.0.BAD
  2. เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เปเบกเปˆเบ™เบเบฑเบ‡ v2bad
  3. เบ™เบฑเบšโ€‹เบ•เบฑเป‰เบ‡โ€‹เปเบ•เปˆโ€‹เบชเบฐโ€‹เบšเบฑเบšโ€‹ 1.0.0 เบšเปเปˆเป€เบ‚เบปเป‰เบฒเปƒเบˆเบงเปˆเบฒเบกเบฑเบ™เปเบกเปˆเบ™เบซเบเบฑเบ‡ surname, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบซเบฑเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”
  4. hell เป„เบ”เป‰เปเบ•เบเบซเบฑเบ, เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบชเบฒเบกเบฒเบ”เบเบฑเบšเบ„เบทเบ™เป„เบ”เป‰

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เป„เบ”เป‰, เบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเป€เบฎเบฑเบ”เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ—เบตเปˆเบšเปเปˆเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เบเบฑเบšเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เปเบฅเบฐเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™, เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบชเบฒเบกเบฒเบ”เบเบฑเบšเบ„เบทเบ™เป„เบ›เบซเบฒเบชเบฐเบšเบฑเบšเบเปˆเบญเบ™เบซเบ™เป‰เบฒ.

เบšเบฑเบ™เบ—เบถเบเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบชเบฐเบ„เบฃเบดเบš

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

เบ—เบตเปˆเบกเบฒ script 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 เบชเบธเบ” surname.

เบเบฒเบ™เบ›เปˆเบฝเบ™เบŠเบทเปˆเบ–เบฑเบ™เปƒเบ™เปเบšเบšเบ—เบตเปˆเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰เบเบฑเบšเบซเบผเบฑเบ‡

เบ™เบตเป‰เปเบกเปˆเบ™เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ—เบปเปˆเบงเป„เบ›เบ—เบตเปˆเบชเบธเบ”เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบญเบฒเบ”เบˆเบฐเบžเบปเบš. เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบˆเปเบฒโ€‹เป€เบ›เบฑเบ™โ€‹เบ•เป‰เบญเบ‡โ€‹เป„เบ”เป‰โ€‹เป€เบฎเบฑเบ”โ€‹เปƒเบซเป‰โ€‹เบเบฒเบ™โ€‹เบ›เปˆเบฝเบ™โ€‹เปเบ›เบ‡โ€‹เบ—เบตเปˆโ€‹เบšเปเปˆโ€‹เป€เบ‚เบปเป‰เบฒโ€‹เบเบฑเบ™โ€‹เบเบฑเบšโ€‹เบซเบผเบฑเบ‡โ€‹. เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบžเบดเบชเบนเบ”เปเบฅเป‰เบงเบงเปˆเบฒเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เป€เบงเบฅเบฒเบชเบนเบ™, เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบ„เบงเบ™เบžเบฝเบ‡เปเบ•เปˆเบ™เปเบฒเปƒเบŠเป‰เบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เบเป‰เบฒเบเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เป‚เบ”เบเบšเปเปˆเบกเบตเบ‚เบฑเป‰เบ™เบ•เบญเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบก. เปƒเบ™เบžเบฒเบเบ™เบตเป‰เบ‚เบญเบ‡เบšเบปเบ”เบ„เบงเบฒเบก, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ›เบฐเบ•เบดเบšเบฑเบ” 3 เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบžเป‰เบญเบกเบเบฑเบšเบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เบเป‰เบฒเบเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เป€เบžเบทเปˆเบญเบšเบฑเบ™เบฅเบธเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบฎเบฑเบเบชเบฒเบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰เบเบฑเบšเบซเบฅเบฑเบ‡.

เบšเบฑเบ™เบ—เบถเบ. เบˆเบทเปˆเป„เบงเป‰เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบกเบตเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบชเบฐเบšเบฑเบš v1. เบกเบฑเบ™เบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบ–เบฑเบ™ first_name ะธ last_name. เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบ›เปˆเบฝเบ™เปเบ›เบ‡ last_name เบชเบธเบ” surname. เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบกเบตเบชเบฐเบšเบฑเบš app 1.0.0, เป€เบŠเบดเปˆเบ‡เบเบฑเบ‡เบšเปเปˆเบ—เบฑเบ™เป„เบ”เป‰เบ™เบณเปƒเบŠเป‰เป€เบ—เบทเปˆเบญ surname.

เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เบต 2: เป€เบžเบตเปˆเบกเบ™เบฒเบกเบชเบฐเบเบธเบ™

เบฅเบธเป‰เบ™เปเบญเบฑเบš: 2.0.0
เบฅเบธเป‰เบ™ DB: v2

เบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™

เป‚เบ”เบเบเบฒเบ™เป€เบžเบตเปˆเบกเบ–เบฑเบ™เปƒเปเปˆ เปเบฅเบฐเบชเบณเป€เบ™เบปเบฒเป€เบ™เบทเป‰เบญเบซเบฒเบ‚เบญเบ‡เบกเบฑเบ™, เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰เบเบฑเบšเบซเบผเบฑเบ‡. เปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™, เบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒ rollback JAR เบซเบผเบทเบกเบต JAR เป€เบเบปเปˆเบฒเปเบฅเปˆเบ™, เบกเบฑเบ™เบˆเบฐเบšเปเปˆเปเบ•เบเปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”.

เบžเบงเบเป€เบฎเบปเบฒเบเบณเบฅเบฑเบ‡เป€เบ›เบตเบ”เบ•เบปเบงเป€เบงเบตเบŠเบฑเบ™เปƒเปเปˆ

เบ‚เบฑเป‰เบ™เบ•เบญเบ™:

  1. เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เบเป‰เบฒเบเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เบ–เบฑเบ™เปƒเบซเบกเปˆ surname. เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบชเบฐเบšเบฑเบš DB เบ‚เบญเบ‡เบ—เปˆเบฒเบ™ v2
  2. เบชเบณเป€เบ™เบปเบฒเบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบ last_name ะฒ surname. เบˆเปˆเบฒเบเป€เบญเบปเบฒเปƒเบˆเปƒเบชเปˆเบงเปˆเบฒเบ–เป‰เบฒเบ—เปˆเบฒเบ™เบกเบตเบ‚เปเป‰เบกเบนเบ™เบ™เบตเป‰เบซเบผเบฒเบ, เบ—เปˆเบฒเบ™เบ„เบงเบ™เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เบเป‰เบฒเบ batch!
  3. เบ‚เบฝเบ™เบฅเบฐเบซเบฑเบ”เบšเปˆเบญเบ™เบ—เบตเปˆเบžเบงเบเป€เบ‚เบปเบฒเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰ เบ—เบฑเบ‡เบชเบญเบ‡ ะธ เปƒเบซเบกเปˆเปเบฅเบฐ เบญเบฒเบเบธ เบ–เบฑเบ™. เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบชเบฐเบšเบฑเบš app เบ‚เบญเบ‡เบ—เปˆเบฒเบ™ 2.0.0
  4. เบญเปˆเบฒเบ™เบ„เปˆเบฒเบˆเบฒเบเบ–เบฑเบ™ surname, เบ–เป‰เบฒเบกเบฑเบ™เบšเปเปˆเปเบกเปˆเบ™ null, เบซเบผเบทเบˆเบฒเบ last_name, เบ–เป‰เบฒเป€เบ›เบฑเบ™ surname เบšเปเปˆเป„เบ”เป‰เบฅเบฐเบšเบธ. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบฅเบถเบš getLastName() เบˆเบฒเบเบฅเบฐเบซเบฑเบ”, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบกเบฑเบ™เบˆเบฐเบญเบญเบ null เปƒเบ™โ€‹เป€เบงโ€‹เบฅเบฒโ€‹เบ—เบตเปˆ rolling เบเบฑเบšโ€‹เบ„เบทเบ™โ€‹เป„เบ›โ€‹เบšเปˆเบญเบ™โ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹เบ‚เบญเบ‡โ€‹เบ—เปˆเบฒเบ™โ€‹เบˆเบฒเบโ€‹ 3.0.0 เบเบฒเบ™ 2.0.0.

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบเปเบฒเบฅเบฑเบ‡เปƒเบŠเป‰ Spring Boot Flyway, เบชเบญเบ‡เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ™เบตเป‰เบˆเบฐเบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบฎเบธเปˆเบ™ 2.0.0 เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบเบฒเบ™เบชเป‰เบฒเบ‡เบชเบฐเบšเบฑเบšเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡, เบ—เปˆเบฒเบ™เบˆเบฐเบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”เบชเบญเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰ (เบ—เปเบฒเบญเบดเบ”เบ›เบฑเบšเบ›เบธเบ‡เบชเบฐเบšเบฑเบš db เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ™เปเบฒเปƒเบŠเป‰เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเปƒเบซเบกเปˆ).

เบกเบฑเบ™เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบชเปเบฒเบ„เบฑเบ™. เบˆเบทเปˆเป„เบงเป‰เบงเปˆเบฒเบ–เบฑเบ™เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เปƒเบซเบกเปˆ เบšเปเปˆโ€‹เบ„เบงเบ™ เบˆเบฐ เบšเปเปˆ NULL. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เป€เบฎเบฑเบ” rollback, เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เป€เบเบปเปˆเบฒเบšเปเปˆเบฎเบนเป‰เบเปˆเบฝเบงเบเบฑเบšเบ„เปเบฅเปเบฒเปƒเบซเบกเปˆเปเบฅเบฐเบˆเบฐเบšเปเปˆเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบกเบฑเบ™เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡ Insert. เปเบ•เปˆเบ–เป‰เบฒเบ—เปˆเบฒเบ™เป€เบžเบตเปˆเบกเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบ™เบตเป‰เปเบฅเบฐ db เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบˆเบฐเป€เบ›เบฑเบ™ v2, เบ™เบตเป‰เบˆเบฐเบ•เป‰เบญเบ‡เบเปเบฒเบ™เบปเบ”เบ„เปˆเบฒเบ‚เบญเบ‡เบ–เบฑเบ™เปƒเบซเบกเปˆ. เป€เบŠเบดเปˆเบ‡เบˆเบฐเบ™เปเบฒเป„เบ›เบชเบนเปˆเบเบฒเบ™เบฅเบฐเป€เบกเบตเบ”เบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”.

เบกเบฑเบ™เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบชเปเบฒเบ„เบฑเบ™. เบ—เปˆเบฒเบ™เบ„เบงเบ™เป€เบญเบปเบฒเบงเบดเบ—เบตเบเบฒเบ™เบญเบญเบ getLastName(), เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบขเบนเปˆเปƒเบ™เบชเบฐเบšเบฑเบš 3.0.0 เบšเปเปˆเบกเบตเปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ‚เบญเบ‡เบ–เบฑเบ™เบขเบนเปˆเปƒเบ™เบฅเบฐเบซเบฑเบ” last_name. เบ™เบตเป‰เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒ null เบˆเบฐเบ–เบทเบเบ•เบฑเป‰เบ‡เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบญเบญเบเบˆเบฒเบเบงเบดเบ—เบตเบเบฒเบ™เปเบฅเบฐเป€เบžเบตเปˆเบกเบเบฒเบ™เบเบงเบ”เบชเบญเบšเบชเปเบฒเบฅเบฑเบš null, เปเบ•เปˆเบเบฒเบ™เปเบเป‰เป„เบ‚เบ—เบตเปˆเบ”เบตเบเบงเปˆเบฒเบซเบผเบฒเบเปเบกเปˆเบ™เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเปƒเบ™เป€เบซเบ”เบœเบปเบ™ getSurname() เบ—เปˆเบฒเบ™เป€เบฅเบทเบญเบเบ„เปˆเบฒเบ—เบตเปˆเบšเปเปˆเปเบกเปˆเบ™เบชเบนเบ™เบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡.

เบเบฒเบ™เบ—เบปเบ”เบชเบญเบš A/B

เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เปƒเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™เปเบกเปˆเบ™เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบกเบตเบชเบฐเบšเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ 1.0.0, deployed เบชเบธเบ”เบเบฒเบ™เบœเบฐเบฅเบดเบ”, เปเบฅเบฐเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เปƒเบ™ v1. เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบ™เปเบฒเปƒเบŠเป‰เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเบชเบญเบ‡เบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบชเบฐเบšเบฑเบš 2.0.0เป€เบŠเบดเปˆเบ‡เบˆเบฐเบ›เบฑเบšเบ›เบธเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เป€เบ›เบฑเบ™ v2.

เบ‚เบฑเป‰เบ™เบ•เบญเบ™:

  1. เบ•เบปเบงเบขเปˆเบฒเบ‡เปƒเปเปˆเบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เป€เบงเบตเบŠเบฑเบ™เบ–เบทเบเบ™เบณเปƒเบŠเป‰ 2.0.0เป€เบŠเบดเปˆเบ‡เบ›เบฑเบšเบ›เบธเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เป€เบ›เบฑเบ™ v2
  2. เปƒเบ™โ€‹เบ‚เบฐโ€‹เบ™เบฐโ€‹เบ”เบฝเบงโ€‹เบเบฑเบ™โ€‹เบšเบฒเบ‡โ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เป‚เบ”เบโ€‹เบ•เบปเบงโ€‹เบขเปˆเบฒเบ‡โ€‹เบชเบฐโ€‹เบšเบฑเบšโ€‹ 1.0.0
  3. เบเบฒเบ™โ€‹เบ›เบฑเบšโ€‹เบ›เบธเบ‡โ€‹เบชเบปเบšโ€‹เบœเบปเบ™โ€‹เบชเปเบฒโ€‹เป€เบฅเบฑเบ”โ€‹เปเบฅเบฐโ€‹เบ—เปˆเบฒเบ™โ€‹เบกเบตโ€‹เบ•เบปเบงโ€‹เบขเปˆเบฒเบ‡โ€‹เบ—เบตเปˆโ€‹เปเบฅเปˆเบ™โ€‹เบซเบผเบฒเบโ€‹เบ‚เบญเบ‡โ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹เบชเบฐโ€‹เบšเบฑเบšโ€‹ 1.0.0 เปเบฅเบฐเบชเบฐเบšเบฑเบšเบญเบทเปˆเบ™เป† 2.0.0. เบ—เบธเบเบ„เบปเบ™เบ•เบดเบ”เบ•เปเปˆเบชเบทเปˆเบชเบฒเบ™เบเบฑเบšเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เปƒเบ™ v2
  4. เบฎเบธเปˆเบ™ 1.0.0 เบšเปเปˆเป„เบ”เป‰เปƒเบŠเป‰เบ–เบฑเบ™เบ™เบฒเบกเบชเบฐเบเบธเบ™เปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™, เปเบ•เปˆเบชเบฐเบšเบฑเบš 2.0.0 เปƒเบŠเป‰. เบžเบงเบเป€เบ‚เบปเบฒเบšเปเปˆเปเบŠเบเปเบŠเบ‡เบเบฑเบ™เปเบฅเบฐเบเบฑเบ™, เปเบฅเบฐเบšเปเปˆเบ„เบงเบ™เบกเบตเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”.
  5. เบฎเบธเปˆเบ™ 2.0.0 เป€เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบ—เบฑเบ‡เปƒเบ™เบ–เบฑเบ™เป€เบเบปเปˆเบฒ เปเบฅเบฐ เปƒเปเปˆ, เบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰เบเบฑเบšเบซเบผเบฑเบ‡

เบกเบฑเบ™เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบชเปเบฒเบ„เบฑเบ™. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบกเบตเบ„เปเบฒเบ–เบฒเบกเปƒเบ”เป†เบ—เบตเปˆเบ™เบฑเบšเบฅเบฒเบเบเบฒเบ™เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบ„เปˆเบฒเบˆเบฒเบเบ„เปเบฅเปเบฒเป€เบเบปเปˆเบฒ / เปƒเบซเบกเปˆ, เบ—เปˆเบฒเบ™เบ„เบงเบ™เบˆเบทเปˆเป„เบงเป‰เบงเปˆเบฒเบ•เบญเบ™เบ™เบตเป‰เบ—เปˆเบฒเบ™เบกเบตเบ„เปˆเบฒเบ—เบตเปˆเบŠเป‰เปเบฒเบเบฑเบ™ (เบชเปˆเบงเบ™เบซเบผเบฒเบเปเบกเปˆเบ™เบžเบงเบเป€เบ‚เบปเบฒเบเบฑเบ‡เป€เบ„เบทเปˆเบญเบ™เบเป‰เบฒเบ). เบ•เบปเบงเบขเปˆเบฒเบ‡: เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบ™เบฑเบšเบˆเปเบฒเบ™เบงเบ™เบœเบนเป‰เปƒเบŠเป‰เบ—เบตเปˆเบกเบตเบ™เบฒเบกเบชเบฐเบเบธเบ™ (เบญเบฑเบ™เปƒเบ”เบเปเปˆเบ•เบฒเบกเบ—เบตเปˆเบ–เบฑเบ™เบ–เบทเบเป€เบญเบตเป‰เบ™เบงเปˆเบฒ) เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบเบ•เบปเบงเบญเบฑเบเบชเบญเบ™. A, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบˆเบปเบ™เบเปˆเบงเบฒเบเบฒเบ™เป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบชเปเบฒเป€เบฅเบฑเบ” (old โ†’ new เบ–เบฑเบ™) เบ—เปˆเบฒเบ™เบญเบฒเบ”เบˆเบฐเบกเบตเบ‚เปเป‰เบกเบนเบ™เบšเปเปˆเบชเบญเบ”เบ„เปˆเบญเบ‡เบซเบฒเบเบ—เปˆเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบ–เบฑเบ™เปƒเปเปˆ.

เบเบฒเบ™โ€‹เป€เบฅเบทเปˆเบญเบ™โ€‹เบ„เบทเบ™โ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบžเบงเบเป€เบฎเบปเบฒเบกเบต app เบชเบฐเบšเบฑเบš 2.0.0 เปเบฅเบฐเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เปƒเบ™ v2.

เบ‚เบฑเป‰เบ™เบ•เบญเบ™:

  1. เบเบฑเบšเบ„เบทเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เปƒเบซเป‰เป€เบ›เบฑเบ™เป€เบงเบตเบŠเบฑเบ™ 1.0.0.
  2. เบฎเบธเปˆเบ™ 1.0.0 เบšเปเปˆเป„เบ”เป‰เปƒเบŠเป‰เบ–เบฑเบ™เปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™ surname, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™ rollback เบ„เบงเบ™เบˆเบฐเบ›เบฐเบชเบปเบšเบœเบปเบ™เบชเปเบฒเป€เบฅเบฑเบ”

DB เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡

เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบกเบตเบ–เบฑเบ™เบŠเบทเปˆ last_name.

script เปเบซเบผเปˆเบ‡ 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.

เป€เบญเบปเบฒเปƒเบˆเปƒเบชเปˆ. เบˆเบทเปˆเป„เบงเป‰เบงเปˆเบฒเบ—เปˆเบฒเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบžเบตเปˆเบกเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ” NOLL เปƒเบ”เป†เปƒเบชเปˆเบ–เบฑเบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เบเปเบฒเบฅเบฑเบ‡เป€เบžเบตเปˆเบก. เบ–เป‰เบฒเบ—เปˆเบฒเบ™ rollback 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

เบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™

เบซเบกเบฒเบโ€‹เป€เบซเบ”โ€‹ per.: เบ›เบฒเบเบปเบ”เบ‚เบทเป‰เบ™, เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบšเบœเบนเป‰เบ‚เบฝเบ™เบœเบดเบ”เบžเบฒเบ”เป„เบ”เป‰เบ„เบฑเบ”เบฅเบญเบเบ‚เปเป‰เบ„เบงเบฒเบกเบ‚เบญเบ‡เบšเบฅเบฑเบญเบเบ™เบตเป‰เบˆเบฒเบเบ‚เบฑเป‰เบ™เบ•เบญเบ™ 2. เปƒเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ™เบตเป‰, เบ„เบงเบ™เบˆเบฐเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เปƒเบ™เบฅเบฐเบซเบฑเบ”เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ—เบตเปˆเบกเบตเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เป€เบžเบทเปˆเบญเป€เบญเบปเบฒเบซเบ™เป‰เบฒเบ—เบตเปˆเปƒเบŠเป‰เบ„เปเบฅเปเบฒ. last_name.

เป‚เบ”เบเบเบฒเบ™เป€เบžเบตเปˆเบกเบ–เบฑเบ™เปƒเปเปˆ เปเบฅเบฐเบชเบณเป€เบ™เบปเบฒเป€เบ™เบทเป‰เบญเบซเบฒเบ‚เบญเบ‡เบกเบฑเบ™, เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰เบเบฑเบšเบซเบผเบฑเบ‡. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒ rollback JAR เบซเบผเบทเบกเบต JAR เป€เบเบปเปˆเบฒเปเบฅเปˆเบ™, เบกเบฑเบ™เบˆเบฐเบšเปเปˆเปเบ•เบเปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”.

เบเบฒเบ™โ€‹เป€เบฅเบทเปˆเบญเบ™โ€‹เบ„เบทเบ™โ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบžเบงเบเป€เบฎเบปเบฒเบกเบต app เบชเบฐเบšเบฑเบš 3.0.0 เปเบฅเบฐเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™ v3. เบฎเบธเปˆเบ™ 3.0.0 เบšเปเปˆเป„เบ”เป‰เบšเบฑเบ™เบ—เบถเบเบ‚เปเป‰เบกเบนเบ™เปƒเบชเปˆ last_name. เบ™เบตเป‰เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเปƒเบ™ surname เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบ—เบตเปˆโ€‹เบ—เบฑเบ™โ€‹เบชเบฐโ€‹เป„เบซเบกโ€‹เบ—เบตเปˆโ€‹เบชเบธเบ”โ€‹เปเบกเปˆเบ™โ€‹เป€เบเบฑเบšโ€‹เบฎเบฑเบโ€‹เบชเบฒโ€‹เป„เบงเป‰โ€‹.

เบ‚เบฑเป‰เบ™เบ•เบญเบ™:

  1. เบเบฑเบšเบ„เบทเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เปƒเบซเป‰เป€เบ›เบฑเบ™เป€เบงเบตเบŠเบฑเบ™ 2.0.0.
  2. เบฎเบธเปˆเบ™ 2.0.0 เปƒเบŠเป‰ เปเบฅเบฐ last_name ะธ surname.
  3. เบฎเบธเปˆเบ™ 2.0.0 เบˆเบฐเปƒเบŠเป‰เป€เบงเบฅเบฒ surnameเบ–เป‰เบฒโ€‹เบซเบฒเบโ€‹เบงเปˆเบฒโ€‹เบกเบฑเบ™โ€‹เบšเปเปˆโ€‹เปเบกเปˆเบ™โ€‹เบชเบนเบ™โ€‹, เบ–เป‰เบฒโ€‹เบšเปเปˆโ€‹เบ”เบฑเปˆเบ‡โ€‹เบ™เบฑเป‰เบ™ -last_name

เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™

เบšเปเปˆเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™. script เบ•เปเปˆเป„เบ›เบ™เบตเป‰เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เบเป‰เบฒเบเบชเบธเบ”เบ—เป‰เบฒเบเบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เป€เบเบปเปˆเบฒ:

-- 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;

เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบฅเบฐเบซเบฑเบ”

เบซเบกเบฒเบโ€‹เป€เบซเบ”โ€‹ per.: เบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบ‚เบญเบ‡เบšเบฅเบฑเบญเบเบ™เบตเป‰เบเบฑเบ‡เบ–เบทเบเบ„เบฑเบ”เบฅเบญเบเบœเบดเบ”เบžเบฒเบ”เป‚เบ”เบเบœเบนเป‰เบ‚เบฝเบ™เบˆเบฒเบเบ‚เบฑเป‰เบ™เบ•เบญเบ™ 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. เบเบฒเบ™เบ™เบณเปƒเบŠเป‰เป€เบงเบตเบŠเบฑเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ 1.0.0 ั v1 schema เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™ (เบŠเบทเปˆเบ–เบฑเบ™ = last_name)
  2. เบเบฒเบ™เบ™เบณเปƒเบŠเป‰เป€เบงเบตเบŠเบฑเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ 2.0.0, เบ—เบตเปˆเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ‚เปเป‰เบกเบนเบ™เบขเบนเปˆเปƒเบ™ last_name ะธ surname. เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบญเปˆเบฒเบ™เบˆเบฒเบ last_name. เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™เบชเบฐเบšเบฑเบš v2เบ›เบฐเบเบญเบšเบกเบตเบ–เบฑเบ™เป€เบŠเบฑเปˆเบ™ last_name, เปเบฅเบฐ surname. surname เปเบกเปˆเบ™เบชเปเบฒเป€เบ™เบปเบฒเบ‚เบญเบ‡ last_name. (เปเบฒเบเป€เบซเบ”: เบ–เบฑเบ™เบ™เบตเป‰เบ•เป‰เบญเบ‡เบšเปเปˆเบกเบตเบ‚เปเป‰เบˆเบณเบเบฑเบ”เบ—เบตเปˆเบšเปเปˆเปเบกเปˆเบ™ null)
  3. เบเบฒเบ™เบ™เบณเปƒเบŠเป‰เป€เบงเบตเบŠเบฑเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ 3.0.0, เป€เบŠเบดเปˆเบ‡เบžเบฝเบ‡เปเบ•เปˆเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ‚เปเป‰เบกเบนเบ™เปƒเบ™ surname เปเบฅเบฐเบญเปˆเบฒเบ™เบˆเบฒเบเบ™เบฒเบกเบชเบฐเบเบธเบ™. เบชเปเบฒเบฅเบฑเบšเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™, เบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เบเป‰เบฒเบเบชเบธเบ”เบ—เป‰เบฒเบเปเบกเปˆเบ™เป€เบเบตเบ”เบ‚เบถเป‰เบ™ last_name ะฒ surname. เบเบฑเบ‡เป€เบ›เบฑเบ™เบ‚เปเป‰เบˆเปเบฒเบเบฑเบ” เบšเปเปˆ NULL เป€เบญเบปเบฒโ€‹เบญเบญเบโ€‹เบˆเบฒเบ last_name. เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™เบขเบนเปˆเปƒเบ™เบชเบฐเบšเบฑเบš v3
  4. เบเบฒเบ™เบ™เบณเปƒเบŠเป‰เป€เบงเบตเบŠเบฑเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ 4.0.0 - เบšเปเปˆเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบฅเบฐเบซเบฑเบ”. เบเบฒเบ™เบ™เบณเปƒเบŠเป‰เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™ v4, เบ—เบตเปˆเป€เบญเบปเบฒเบญเบญเบ last_name. เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบžเบตเปˆเบกเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เปƒเบ”เป†เบ—เบตเปˆเบ‚เบฒเบ”เบซเบฒเบเป„เบ›เปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™.

เป‚เบ”เบเบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบกเบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰, เบ—เปˆเบฒเบ™เบชเบฐเป€เบซเบกเบตเบชเบฒเบกเบฒเบ”เบเบฑเบšเบ„เบทเบ™เบซเบ™เบถเปˆเบ‡เบชเบฐเบšเบฑเบšเป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบ—เปเบฒเบฅเบฒเบเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™ / เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰.

เบฅเบฐโ€‹เบซเบฑเบ”

เบฅเบฐเบซเบฑเบ”เบ—เบฑเบ‡เปเบปเบ”เบ—เบตเปˆเปƒเบŠเป‰เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เปเบกเปˆเบ™เบกเบตเบขเบนเปˆ GitHub. เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰เปเบกเปˆเบ™เบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเป€เบžเบตเปˆเบกเป€เบ•เบตเบก.

เป‚เบ„เบ‡เบเบฒเบ™

เบซเบผเบฑเบ‡เบˆเบฒเบ cloning repository, เบ—เปˆเบฒเบ™เบˆเบฐเป€เบซเบฑเบ™เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เป‚เบŸเบ™เป€เบ”เบตเบ•เปเปˆเป„เบ›เบ™เบตเป‰.

โ”œโ”€โ”€ 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 เบ•เบปเบงเบขเปˆเบฒเบ‡ Flyway

เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เป€เบญเบปเบฒเบกเบฒเบˆเบฒเบ Spring Boot Sample Flyway.

เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เป€เบงเบฅเบฒเป€เบšเบดเปˆเบ‡ http://localhost:8080/flyway, เบกเบตเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เบชเบฐเบ„เบดเบš.

เบ•เบปเบงเบขเปˆเบฒเบ‡เบ™เบตเป‰เบเบฑเบ‡เบ›เบฐเบเบญเบšเบกเบต H2 console (at http://localhost:8080/h2-console) เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เบชเบฐเบ–เบฒเบ™เบฐเบžเบฒเบšเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™ ( URL jdbc เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปเบกเปˆเบ™ jdbc:h2:mem:testdb).

เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™

เบญเปˆเบฒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบญเบทเปˆเบ™เป†เปƒเบ™ blog เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ:

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™