แƒœแƒฃแƒšแƒแƒ•แƒแƒœแƒ˜ แƒจแƒ”แƒคแƒ”แƒ แƒฎแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ แƒ“แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ”แƒ‘แƒ˜

แƒœแƒฃแƒšแƒแƒ•แƒแƒœแƒ˜ แƒจแƒ”แƒคแƒ”แƒ แƒฎแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ แƒ“แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ”แƒ‘แƒ˜

แƒ”แƒก แƒกแƒขแƒแƒขแƒ˜แƒ แƒ“แƒ”แƒขแƒแƒšแƒฃแƒ แƒแƒ“ แƒ’แƒแƒœแƒ›แƒแƒ แƒขแƒแƒ•แƒก, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒฃแƒœแƒ“แƒ แƒ’แƒแƒ“แƒแƒญแƒ แƒแƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒแƒ“แƒแƒ‘แƒ˜แƒก แƒกแƒแƒ™แƒ˜แƒ—แƒฎแƒ”แƒ‘แƒ˜ แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒกแƒแƒก. แƒฉแƒ•แƒ”แƒœ แƒ’แƒ”แƒขแƒงแƒ•แƒ˜แƒ—, แƒ แƒ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ“แƒแƒ”แƒ›แƒแƒ แƒ—แƒแƒก แƒ—แƒฅแƒ•แƒ”แƒœแƒก แƒกแƒแƒฌแƒแƒ แƒ›แƒแƒ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒก, แƒ—แƒฃ แƒจแƒ”แƒ”แƒชแƒ“แƒ”แƒ‘แƒ˜แƒ— แƒ’แƒแƒœแƒแƒ—แƒแƒ•แƒกแƒแƒ— แƒฌแƒ˜แƒœแƒแƒกแƒฌแƒแƒ แƒ˜ แƒ›แƒแƒ›แƒ–แƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”. แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ•แƒ˜แƒ•แƒšแƒ˜แƒ— แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒกแƒแƒกแƒ˜แƒชแƒแƒชแƒฎแƒšแƒ แƒชแƒ˜แƒ™แƒšแƒ˜แƒก แƒ”แƒขแƒแƒžแƒ”แƒ‘แƒก, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒกแƒแƒญแƒ˜แƒ แƒแƒ แƒœแƒฃแƒšแƒแƒ•แƒแƒœแƒ˜ แƒจแƒ”แƒคแƒ”แƒ แƒฎแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก (แƒ“แƒแƒแƒฎแƒš. แƒ–แƒแƒšแƒ˜: แƒจแƒ”แƒ›แƒ“แƒ’แƒแƒ›แƒ˜ - แƒœแƒฃแƒšแƒแƒ•แƒแƒœแƒ˜ แƒจแƒ”แƒคแƒ”แƒ แƒฎแƒ”แƒ‘แƒ˜แƒก แƒ“แƒ แƒ). แƒฉแƒ•แƒ”แƒœแƒ˜ แƒแƒžแƒ”แƒ แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ“แƒ”แƒ’แƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒฃแƒ™แƒฃแƒจแƒ”แƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒแƒ“แƒ˜ แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒฃแƒ™แƒฃแƒฆแƒ›แƒ แƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒแƒ“แƒ˜ แƒ’แƒ–แƒ˜แƒ—.

แƒ—แƒฃ แƒ’แƒกแƒฃแƒ แƒ— แƒ’แƒแƒ˜แƒ’แƒแƒ— แƒ™แƒแƒ“แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ”แƒ‘แƒ˜ แƒกแƒขแƒแƒขแƒ˜แƒ˜แƒ“แƒแƒœ, แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ˜แƒžแƒแƒ•แƒแƒ— แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒแƒฅ GitHub.

แƒจแƒ”แƒกแƒแƒ•แƒแƒšแƒ˜

แƒœแƒฃแƒšแƒแƒ•แƒแƒœแƒ˜ แƒจแƒ”แƒคแƒ”แƒ แƒฎแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ

แƒ แƒ แƒ›แƒ˜แƒกแƒขแƒ˜แƒ™แƒฃแƒ แƒ˜แƒ แƒœแƒฃแƒšแƒแƒ•แƒแƒœแƒ˜ แƒจแƒ”แƒคแƒ”แƒ แƒฎแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ? แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ˜แƒ—แƒฅแƒ•แƒแƒก, แƒ แƒแƒ› แƒ”แƒก แƒฎแƒ“แƒ”แƒ‘แƒ แƒ›แƒแƒจแƒ˜แƒœ, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ˜แƒกแƒ”, แƒ แƒแƒ› แƒ—แƒฅแƒ•แƒ”แƒœ แƒฌแƒแƒ แƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ— แƒจแƒ”แƒซแƒšแƒ”แƒ‘แƒ— แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒแƒฎแƒแƒšแƒ˜ แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒก แƒฌแƒแƒ แƒ›แƒแƒ”แƒ‘แƒแƒจแƒ˜ แƒฌแƒแƒ แƒ“แƒ’แƒ”แƒœแƒแƒก, แƒฎแƒแƒšแƒ แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ”แƒšแƒ˜ แƒ•แƒ”แƒ  แƒจแƒ”แƒแƒ›แƒฉแƒœแƒ”แƒ•แƒก แƒ›แƒ˜แƒก แƒ›แƒ˜แƒฃแƒฌแƒ•แƒ“แƒแƒ›แƒšแƒแƒ‘แƒแƒก. แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒกแƒ แƒ“แƒ แƒ™แƒแƒ›แƒžแƒแƒœแƒ˜แƒ˜แƒก แƒžแƒ”แƒ แƒกแƒžแƒ”แƒฅแƒขแƒ˜แƒ•แƒ˜แƒ“แƒแƒœ, แƒ”แƒก แƒแƒ แƒ˜แƒก แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒกแƒแƒฃแƒ™แƒ”แƒ—แƒ”แƒกแƒ แƒจแƒ”แƒกแƒแƒซแƒšแƒ แƒกแƒชแƒ”แƒœแƒแƒ แƒ˜, แƒ แƒแƒ“แƒ’แƒแƒœ แƒ˜แƒก แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒแƒซแƒšแƒ”แƒ•แƒก แƒแƒฎแƒแƒšแƒ˜ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ•แƒแƒก แƒ“แƒ แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒกแƒฌแƒแƒ แƒ”แƒ‘แƒแƒก แƒจแƒ”แƒคแƒ”แƒ แƒฎแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”.

แƒ แƒแƒ’แƒแƒ  แƒ›แƒ˜แƒ•แƒแƒฆแƒฌแƒ˜แƒแƒ— แƒแƒ›แƒแƒก? แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ’แƒ–แƒ แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก, แƒแƒฅ แƒแƒ แƒ˜แƒก แƒ”แƒ แƒ—แƒ˜ แƒ›แƒแƒ—แƒ’แƒแƒœแƒ˜:

  • แƒ’แƒแƒœแƒแƒ—แƒแƒ•แƒกแƒ”แƒ— แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒกแƒ”แƒ แƒ•แƒ˜แƒกแƒ˜แƒก แƒœแƒแƒ›แƒ”แƒ แƒ˜ 1 แƒ•แƒ”แƒ แƒกแƒ˜แƒ
  • แƒจแƒ”แƒแƒกแƒ แƒฃแƒšแƒ”แƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒ›แƒ˜แƒ’แƒ แƒแƒชแƒ˜แƒ
  • แƒ’แƒแƒœแƒแƒ—แƒแƒ•แƒกแƒ”แƒ— แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒกแƒ”แƒ แƒ•แƒ˜แƒกแƒ˜แƒก #2 แƒ•แƒ”แƒ แƒกแƒ˜แƒ #1 แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒก แƒžแƒแƒ แƒแƒšแƒ”แƒšแƒฃแƒ แƒแƒ“
  • แƒ แƒแƒ’แƒแƒ แƒช แƒ™แƒ˜ แƒ“แƒแƒ˜แƒœแƒแƒฎแƒแƒ•แƒ—, แƒ แƒแƒ› แƒ•แƒ”แƒ แƒกแƒ˜แƒ No2 แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก แƒ˜แƒกแƒ”, แƒ แƒแƒ’แƒแƒ แƒช แƒฃแƒœแƒ“แƒ, แƒฌแƒแƒจแƒแƒšแƒ”แƒ— แƒ•แƒ”แƒ แƒกแƒ˜แƒ No1
  • แƒ›แƒ–แƒแƒ“ แƒแƒ แƒ˜แƒก!

แƒแƒ“แƒ•แƒ˜แƒšแƒ˜แƒ, แƒแƒ แƒ? แƒกแƒแƒ›แƒฌแƒฃแƒฎแƒแƒ แƒแƒ“, แƒ”แƒก แƒแƒ แƒช แƒ˜แƒกแƒ” แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜แƒ แƒ“แƒ แƒแƒ›แƒแƒก แƒ“แƒ”แƒขแƒแƒšแƒฃแƒ แƒแƒ“ แƒ›แƒแƒ’แƒ•แƒ˜แƒแƒœแƒ”แƒ‘แƒ˜แƒ— แƒ’แƒแƒœแƒ•แƒ˜แƒฎแƒ˜แƒšแƒแƒ•แƒ—. แƒแƒฎแƒšแƒ แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒแƒ›แƒแƒฌแƒ›แƒแƒ— แƒ™แƒ˜แƒ“แƒ”แƒ• แƒ”แƒ แƒ—แƒ˜ แƒกแƒแƒ™แƒ›แƒแƒแƒ“ แƒ’แƒแƒ•แƒ แƒชแƒ”แƒšแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜ - แƒšแƒฃแƒ แƒฏแƒ˜ แƒ›แƒฌแƒ•แƒแƒœแƒ” แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ.

แƒ’แƒกแƒ›แƒ”แƒœแƒ˜แƒแƒ— แƒแƒ“แƒ”แƒกแƒ›แƒ” แƒšแƒฃแƒ แƒฏแƒ˜ แƒ›แƒฌแƒ•แƒแƒœแƒ” แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ? Cloud Foundry แƒแƒ›แƒแƒก แƒซแƒแƒšแƒ˜แƒแƒœ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒก แƒฎแƒ“แƒ˜แƒก. แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒจแƒ”แƒฎแƒ”แƒ“แƒ” แƒแƒ› แƒ›แƒฃแƒฎแƒšแƒ˜แƒก, แƒกแƒแƒ“แƒแƒช แƒแƒ›แƒแƒก แƒฃแƒคแƒ แƒ แƒ“แƒ”แƒขแƒแƒšแƒฃแƒ แƒแƒ“ แƒแƒฆแƒ•แƒฌแƒ”แƒ แƒ—. แƒ›แƒแƒ™แƒšแƒ”แƒ“ แƒ แƒแƒ› แƒจแƒ”แƒ•แƒแƒฏแƒแƒ›แƒแƒ—, แƒจแƒ”แƒ’แƒแƒฎแƒกแƒ”แƒœแƒ”แƒ‘แƒ—, แƒ แƒแƒ’แƒแƒ  แƒ’แƒแƒ•แƒแƒ™แƒ”แƒ—แƒแƒ— แƒšแƒฃแƒ แƒฏแƒ˜ แƒ›แƒฌแƒ•แƒแƒœแƒ” แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ:

  • แƒ“แƒแƒ แƒฌแƒ›แƒฃแƒœแƒ“แƒ˜แƒ—, แƒ แƒแƒ› แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒฌแƒแƒ แƒ›แƒแƒ”แƒ‘แƒ˜แƒก แƒ™แƒแƒ“แƒ˜แƒก แƒแƒ แƒ˜ แƒแƒกแƒšแƒ˜ (โ€žแƒšแƒฃแƒ แƒฏแƒ˜โ€œ แƒ“แƒ โ€žแƒ›แƒฌแƒ•แƒแƒœแƒ”โ€œ) แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก;
  • แƒ›แƒ—แƒ”แƒšแƒ˜ แƒขแƒ แƒแƒคแƒ˜แƒ™แƒ˜ แƒšแƒฃแƒ แƒฏ แƒ’แƒแƒ แƒ”แƒ›แƒแƒจแƒ˜, แƒ”.แƒ˜. แƒ˜แƒกแƒ”, แƒ แƒแƒ› แƒฌแƒแƒ แƒ›แƒแƒ”แƒ‘แƒ˜แƒก URL-แƒ”แƒ‘แƒ˜ แƒ›แƒ˜แƒฃแƒ—แƒ˜แƒ—แƒ”แƒ‘แƒก แƒ˜แƒฅ;
  • แƒ’แƒแƒœแƒแƒ—แƒแƒ•แƒกแƒ”แƒ— แƒ“แƒ แƒจแƒ”แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ— แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒ แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ แƒ›แƒฌแƒ•แƒแƒœแƒ” แƒ’แƒแƒ แƒ”แƒ›แƒแƒจแƒ˜;
  • urls-แƒ˜แƒก แƒจแƒ”แƒชแƒ•แƒšแƒ แƒšแƒฃแƒ แƒฏแƒ˜แƒ“แƒแƒœ แƒ›แƒฌแƒ•แƒแƒœแƒ” แƒ’แƒแƒ แƒ”แƒ›แƒแƒ–แƒ”

แƒšแƒฃแƒ แƒฏแƒ˜ แƒ›แƒฌแƒ•แƒแƒœแƒ” แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ แƒแƒ แƒ˜แƒก แƒ›แƒ˜แƒ“แƒ’แƒแƒ›แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒแƒ“ แƒจแƒ”แƒ›แƒแƒ˜แƒขแƒแƒœแƒแƒ— แƒแƒฎแƒแƒšแƒ˜ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜ แƒฌแƒแƒ แƒ›แƒแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ แƒฆแƒ•แƒ”แƒ•แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒคแƒ˜แƒฅแƒ แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”. แƒ”แƒก แƒ’แƒแƒ›แƒแƒฌแƒ•แƒ”แƒฃแƒšแƒ˜แƒ แƒ˜แƒ›แƒ˜แƒ—, แƒ แƒแƒ› แƒ›แƒแƒจแƒ˜แƒœแƒแƒช แƒ™แƒ˜, แƒ—แƒฃ แƒ แƒแƒ›แƒ” แƒ›แƒแƒฎแƒ“แƒ”แƒ‘แƒ, แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒแƒ“ แƒ’แƒแƒ“แƒแƒฎแƒ•แƒ˜แƒ“แƒ”แƒ— แƒฌแƒ˜แƒœแƒ แƒ’แƒแƒ แƒ”แƒ›แƒแƒจแƒ˜, แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ โ€žแƒ’แƒแƒ“แƒแƒ›แƒ แƒ—แƒ•แƒ”แƒšแƒ˜แƒก แƒ“แƒแƒญแƒ”แƒ แƒ˜แƒ—โ€œ.

แƒงแƒแƒ•แƒ”แƒšแƒ˜แƒ•แƒ” แƒ–แƒ”แƒ›แƒแƒแƒฆแƒœแƒ˜แƒจแƒœแƒฃแƒšแƒ˜แƒก แƒฌแƒแƒ™แƒ˜แƒ—แƒฎแƒ•แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ“แƒแƒ’แƒ˜แƒกแƒ•แƒแƒ— แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ: แƒ แƒ แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜ แƒแƒฅแƒ•แƒก แƒœแƒฃแƒšแƒแƒ•แƒแƒœแƒ˜ แƒจแƒ”แƒคแƒ”แƒ แƒฎแƒ”แƒ‘แƒ˜แƒก แƒ“แƒ แƒ แƒšแƒฃแƒ แƒฏ แƒ›แƒฌแƒ•แƒแƒœแƒ” แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒแƒก?

แƒ™แƒแƒ แƒ’แƒแƒ“, แƒ›แƒแƒ— แƒกแƒแƒ™แƒ›แƒแƒแƒ“ แƒ‘แƒ”แƒ•แƒ แƒ˜ แƒกแƒแƒ”แƒ แƒ—แƒ แƒแƒฅแƒ•แƒ—, แƒ แƒแƒ“แƒ’แƒแƒœ แƒ”แƒ แƒ—แƒ˜ แƒ“แƒ แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒ’แƒแƒ แƒ”แƒ›แƒแƒก แƒแƒ แƒ˜ แƒแƒกแƒšแƒ˜แƒก แƒจแƒ”แƒœแƒแƒ แƒฉแƒฃแƒœแƒ”แƒ‘แƒ แƒ›แƒแƒ˜แƒ—แƒฎแƒแƒ•แƒก แƒแƒ แƒ›แƒแƒ’ แƒซแƒแƒšแƒ˜แƒกแƒฎแƒ›แƒ”แƒ•แƒแƒก แƒ›แƒแƒ— แƒจแƒ”แƒกแƒแƒœแƒแƒ แƒฉแƒฃแƒœแƒ”แƒ‘แƒšแƒแƒ“. แƒแƒ›แƒ˜แƒขแƒแƒ›แƒแƒช แƒแƒ›แƒขแƒ™แƒ˜แƒชแƒ”แƒ‘แƒก แƒ–แƒแƒ’แƒ˜แƒ”แƒ แƒ—แƒ˜ แƒ’แƒฃแƒœแƒ“แƒ˜ แƒ›แƒแƒ แƒขแƒ˜แƒœ แƒคแƒแƒฃแƒšแƒ”แƒ แƒ˜แƒ›แƒ˜แƒฐแƒงแƒ”แƒ•แƒ˜แƒ— แƒแƒ› แƒ›แƒ˜แƒ“แƒ’แƒแƒ›แƒ˜แƒก แƒ•แƒแƒ แƒ˜แƒแƒชแƒ˜แƒแƒก:

แƒ™แƒ˜แƒ“แƒ”แƒ• แƒ”แƒ แƒ—แƒ˜ แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒ˜แƒ แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ, แƒšแƒฃแƒ แƒฏ-แƒ›แƒฌแƒ•แƒแƒœแƒ” แƒ™แƒแƒœแƒชแƒ”แƒœแƒขแƒ แƒแƒขแƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ แƒ•แƒ”แƒ‘แƒกแƒ แƒ“แƒ แƒ“แƒแƒ›แƒ”แƒœแƒ˜แƒก แƒคแƒ”แƒœแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒแƒ› แƒ›แƒ˜แƒ“แƒ’แƒแƒ›แƒ˜แƒ—, แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ แƒฎแƒจแƒ˜แƒ แƒแƒ“ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ˜แƒงแƒแƒก แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ, แƒ’แƒแƒœแƒกแƒแƒ™แƒฃแƒ—แƒ แƒ”แƒ‘แƒ˜แƒ— แƒ›แƒแƒจแƒ˜แƒœ, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ’แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒแƒ— แƒ›แƒ˜แƒกแƒ˜ แƒกแƒฅแƒ”แƒ›แƒ˜แƒก แƒจแƒ”แƒชแƒ•แƒšแƒ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒฃแƒšแƒ˜ แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒ˜แƒก แƒแƒฎแƒแƒšแƒ˜ แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒก แƒ›แƒฎแƒแƒ แƒ“แƒแƒกแƒแƒญแƒ”แƒ แƒแƒ“.

แƒ“แƒ แƒแƒฅ แƒ›แƒ˜แƒ•แƒ”แƒ“แƒ˜แƒ— แƒ›แƒ—แƒแƒ•แƒแƒ  แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒแƒ›แƒ“แƒ” แƒแƒ› แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜. แฒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ. แƒ›แƒแƒ“แƒ˜แƒ— แƒ™แƒ˜แƒ“แƒ”แƒ• แƒ”แƒ แƒ—แƒฎแƒ”แƒš แƒจแƒ”แƒ•แƒฎแƒ”แƒ“แƒแƒ— แƒแƒ› แƒคแƒ แƒแƒ–แƒแƒก.

แƒจแƒ”แƒแƒกแƒ แƒฃแƒšแƒ”แƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒ›แƒ˜แƒ’แƒ แƒแƒชแƒ˜แƒ.

แƒแƒฎแƒšแƒ แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ“แƒแƒฃแƒกแƒ•แƒแƒ— แƒกแƒแƒ™แƒฃแƒ—แƒแƒ  แƒ—แƒแƒ•แƒก แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ - แƒ แƒ แƒ›แƒแƒฎแƒ“แƒ”แƒ‘แƒ, แƒ—แƒฃ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ แƒแƒ  แƒแƒ แƒ˜แƒก แƒฃแƒ™แƒฃแƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒแƒ“แƒ˜? แƒแƒ  แƒฌแƒงแƒ“แƒ”แƒ‘แƒ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒฉแƒ”แƒ›แƒ˜ แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒ•แƒ”แƒ แƒกแƒ˜แƒ? แƒกแƒ˜แƒœแƒแƒ›แƒ“แƒ•แƒ˜แƒšแƒ”แƒจแƒ˜, แƒ”แƒก แƒแƒ แƒ˜แƒก แƒ–แƒฃแƒกแƒขแƒแƒ“ แƒ˜แƒก, แƒ แƒแƒช แƒ›แƒแƒฎแƒ“แƒ”แƒ‘แƒ ...

แƒแƒกแƒ” แƒ แƒแƒ›, แƒ›แƒ˜แƒฃแƒฎแƒ”แƒ“แƒแƒ•แƒแƒ“ แƒœแƒฃแƒšแƒแƒ•แƒแƒœแƒ˜ แƒจแƒ”แƒคแƒ”แƒ แƒฎแƒ”แƒ‘แƒ˜แƒก / แƒšแƒฃแƒ แƒฏแƒ˜ แƒ›แƒฌแƒ•แƒแƒœแƒ” แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒฃแƒ–แƒแƒ แƒ›แƒแƒ–แƒแƒ แƒ˜ แƒฃแƒžแƒ˜แƒ แƒแƒขแƒ”แƒกแƒแƒ‘แƒ”แƒ‘แƒ˜แƒกแƒ, แƒ™แƒแƒ›แƒžแƒแƒœแƒ˜แƒ”แƒ‘แƒ˜ แƒ›แƒ˜แƒ“แƒ แƒ”แƒ™แƒ˜แƒšแƒœแƒ˜ แƒแƒ แƒ˜แƒแƒœ แƒ“แƒแƒ˜แƒชแƒ•แƒแƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒฃแƒกแƒแƒคแƒ แƒ—แƒฎแƒ แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜ แƒ›แƒแƒ—แƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒกแƒแƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒšแƒแƒ“:

  • แƒ›แƒแƒแƒ›แƒ–แƒแƒ“แƒ”แƒ— แƒžแƒแƒ™แƒ”แƒขแƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒแƒฎแƒแƒšแƒ˜ แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒ—
  • แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒ—แƒ˜แƒจแƒ•แƒ
  • แƒ’แƒแƒฃแƒจแƒ•แƒ˜แƒ— แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ”แƒ‘แƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒ›แƒ˜แƒ’แƒ แƒแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก
  • แƒ’แƒแƒœแƒแƒ—แƒแƒ•แƒกแƒ”แƒ— แƒ“แƒ แƒ’แƒแƒฃแƒจแƒ•แƒ˜แƒ— แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒแƒฎแƒแƒšแƒ˜ แƒ•แƒ”แƒ แƒกแƒ˜แƒ

แƒแƒ› แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ แƒฉแƒ•แƒ”แƒœ แƒ“แƒ”แƒขแƒแƒšแƒฃแƒ แƒแƒ“ แƒ’แƒแƒœแƒ•แƒ˜แƒฎแƒ˜แƒšแƒแƒ•แƒ—, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ˜แƒ›แƒฃแƒจแƒแƒแƒ— แƒ—แƒฅแƒ•แƒ”แƒœแƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒกแƒ—แƒแƒœ แƒ“แƒ แƒ™แƒแƒ“แƒ—แƒแƒœ, แƒ แƒแƒ› แƒ˜แƒกแƒแƒ แƒ’แƒ”แƒ‘แƒšแƒแƒ— แƒœแƒฃแƒšแƒแƒ•แƒแƒœแƒ˜ แƒจแƒ”แƒคแƒ”แƒ แƒฎแƒ”แƒ‘แƒ˜แƒ—.

แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒกแƒแƒ™แƒ˜แƒ—แƒฎแƒ”แƒ‘แƒ˜

แƒ—แƒฃ แƒ—แƒฅแƒ•แƒ”แƒœ แƒ’แƒแƒฅแƒ•แƒ— แƒ›แƒแƒฅแƒแƒšแƒแƒฅแƒ”แƒแƒ‘แƒ˜แƒก แƒแƒ แƒ›แƒฅแƒแƒœแƒ” แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ  แƒ˜แƒœแƒแƒฎแƒแƒ•แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒจแƒ˜, แƒ›แƒแƒจแƒ˜แƒœแƒ•แƒ” แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ›แƒ˜แƒ˜แƒฆแƒแƒ— แƒœแƒฃแƒšแƒแƒ•แƒแƒœแƒ˜ แƒจแƒ”แƒคแƒ”แƒ แƒฎแƒ”แƒ‘แƒ˜แƒก แƒ“แƒ แƒ. แƒกแƒแƒ›แƒฌแƒฃแƒฎแƒแƒ แƒแƒ“, แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒฃแƒšแƒ˜ แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒ˜แƒก แƒฃแƒ›แƒ”แƒขแƒ”แƒกแƒแƒ‘แƒแƒก แƒกแƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒกแƒแƒ“แƒ›แƒ” แƒจแƒ”แƒœแƒแƒฎแƒ•แƒ. แƒแƒ›แƒ˜แƒขแƒแƒ› แƒแƒ แƒฏแƒ”แƒ  แƒฃแƒœแƒ“แƒ แƒ“แƒแƒคแƒ˜แƒฅแƒ แƒ“แƒ”แƒ— แƒฌแƒ แƒ”แƒจแƒ˜ แƒ แƒแƒ˜แƒ›แƒ” แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒขแƒแƒœแƒแƒ›แƒ“แƒ”. แƒกแƒแƒœแƒแƒ› แƒจแƒ”แƒ•แƒ˜แƒกแƒฌแƒแƒ•แƒšแƒ˜แƒ— แƒ“แƒ”แƒขแƒแƒšแƒ”แƒ‘แƒก, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒฃแƒœแƒ“แƒ แƒจแƒ”แƒชแƒ•แƒแƒšแƒแƒ— แƒกแƒฅแƒ”แƒ›แƒ แƒ˜แƒกแƒ”, แƒ แƒแƒ› แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜ แƒ˜แƒงแƒแƒก แƒจแƒ”แƒคแƒ”แƒ แƒฎแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ” แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ, แƒ›แƒแƒ“แƒ˜แƒ— แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ แƒ˜แƒ’แƒจแƒ˜ แƒงแƒฃแƒ แƒแƒ“แƒฆแƒ”แƒ‘แƒ แƒ’แƒแƒ•แƒแƒ›แƒแƒฎแƒ•แƒ˜แƒšแƒแƒ— แƒ•แƒ”แƒ แƒกแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒกแƒฅแƒ”แƒ›แƒแƒ–แƒ”.

แƒ•แƒ”แƒ แƒกแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒกแƒฅแƒ”แƒ›แƒ

แƒแƒ› แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒ›แƒคแƒ แƒ˜แƒœแƒแƒ•แƒ˜ แƒ แƒแƒ’แƒแƒ แƒช แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒก แƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ˜แƒก แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ˜ (แƒ“แƒแƒแƒฎแƒš. แƒ—แƒแƒ แƒ’แƒ›แƒแƒœแƒ˜: แƒฉแƒ•แƒ”แƒœ แƒ•แƒกแƒแƒฃแƒ‘แƒ แƒแƒ‘แƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒ›แƒ˜แƒ’แƒ แƒแƒชแƒ˜แƒแƒ–แƒ”). แƒ‘แƒฃแƒœแƒ”แƒ‘แƒ แƒ˜แƒ•แƒ˜แƒ, แƒฉแƒ•แƒ”แƒœ แƒแƒกแƒ”แƒ•แƒ” แƒ“แƒแƒ•แƒฌแƒ”แƒ แƒ— Spring Boot แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒแƒก, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒแƒฅแƒ•แƒก แƒฉแƒแƒจแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ Flyway แƒ›แƒฎแƒแƒ แƒ“แƒแƒญแƒ”แƒ แƒ แƒ“แƒ แƒจแƒ”แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒก แƒกแƒฅแƒ”แƒ›แƒ˜แƒก แƒ›แƒ˜แƒ’แƒ แƒแƒชแƒ˜แƒแƒก แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ™แƒแƒœแƒขแƒ”แƒฅแƒกแƒขแƒ˜แƒก แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒกแƒแƒก. 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, แƒ—แƒฅแƒ•แƒ”แƒœ แƒ›แƒ˜แƒ˜แƒฆแƒ”แƒ‘แƒ— 2 แƒ“แƒ˜แƒ“ แƒกแƒแƒ แƒ’แƒ”แƒ‘แƒ”แƒšแƒก:

  • แƒ—แƒฅแƒ•แƒ”แƒœ แƒ’แƒแƒœแƒแƒกแƒฎแƒ•แƒแƒ•แƒ”แƒ‘แƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒก แƒ™แƒแƒ“แƒ˜แƒก แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒกแƒ’แƒแƒœ
  • แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒ›แƒ˜แƒ’แƒ แƒแƒชแƒ˜แƒ แƒฎแƒ“แƒ”แƒ‘แƒ แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒแƒกแƒ—แƒแƒœ แƒ”แƒ แƒ—แƒแƒ“, แƒ”.แƒ˜. แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜ แƒ’แƒแƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ

แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒ’แƒ•แƒแƒ แƒ”แƒ‘แƒ

แƒกแƒขแƒแƒขแƒ˜แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒœแƒแƒฌแƒ˜แƒšแƒจแƒ˜ แƒฉแƒ•แƒ”แƒœ แƒงแƒฃแƒ แƒแƒ“แƒฆแƒ”แƒ‘แƒแƒก แƒ’แƒแƒ•แƒแƒ›แƒแƒฎแƒ•แƒ˜แƒšแƒ”แƒ‘แƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒแƒ  แƒ›แƒ˜แƒ“แƒ’แƒแƒ›แƒแƒ–แƒ”.

  • แƒฉแƒแƒ›แƒแƒ แƒฉแƒ”แƒœแƒ˜แƒšแƒ˜ แƒจแƒ”แƒฃแƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒšแƒแƒ‘แƒ
  • แƒฉแƒแƒ›แƒแƒ แƒฉแƒ”แƒœแƒ˜แƒšแƒ˜ แƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒแƒ“แƒแƒ‘แƒ

แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒ’แƒแƒœแƒ˜แƒฎแƒ˜แƒšแƒ”แƒ‘แƒ, แƒ แƒแƒ’แƒแƒ แƒช แƒ’แƒแƒคแƒ แƒ—แƒฎแƒ˜แƒšแƒ”แƒ‘แƒ, แƒ แƒแƒ› แƒแƒ  แƒฃแƒœแƒ“แƒ แƒจแƒ”แƒแƒกแƒ แƒฃแƒšแƒแƒ— แƒœแƒฃแƒšแƒแƒ•แƒแƒœแƒ˜ แƒจแƒ”แƒคแƒ”แƒ แƒฎแƒ”แƒ‘แƒ แƒฌแƒ˜แƒœแƒแƒกแƒฌแƒแƒ แƒ˜ แƒ›แƒแƒ›แƒ–แƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”... แƒ›แƒ”แƒแƒ แƒ” แƒ’แƒ•แƒ—แƒแƒ•แƒแƒ–แƒแƒ‘แƒก แƒ’แƒแƒ›แƒแƒกแƒแƒ•แƒแƒšแƒก, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ’แƒแƒœแƒแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒแƒ— แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ แƒจแƒ”แƒคแƒ”แƒ แƒฎแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ” แƒ“แƒ แƒแƒ›แƒแƒ•แƒ” แƒ“แƒ แƒแƒก แƒจแƒ”แƒ˜แƒœแƒแƒ แƒฉแƒฃแƒœแƒแƒ— แƒฃแƒ™แƒแƒœ แƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒแƒ“แƒแƒ‘แƒ.

แƒฉแƒ•แƒ”แƒœแƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ–แƒ”แƒช แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ—, แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ Spring Boot Flyway แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒแƒฅแƒ•แƒก Person ั first_name ะธ last_name แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒจแƒ˜ (แƒ“แƒแƒแƒฎแƒš. แƒ—แƒแƒ แƒ’แƒ›แƒแƒœแƒ˜: Person แƒแƒ แƒ˜แƒก แƒ›แƒแƒ’แƒ˜แƒ“แƒ แƒ“แƒ แƒ•irst_name ะธ last_name - แƒ”แƒก แƒแƒ แƒ˜แƒก แƒ•แƒ”แƒšแƒ”แƒ‘แƒ˜ แƒ›แƒแƒกแƒจแƒ˜). แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒ˜แƒœแƒ“แƒ แƒ’แƒแƒ“แƒแƒ แƒฅแƒ›แƒ”แƒ•แƒ last_name ะฒ surname.

แƒ•แƒแƒ แƒแƒฃแƒ“แƒ”แƒ‘แƒ˜

แƒกแƒแƒœแƒแƒ› แƒ“แƒ”แƒขแƒแƒšแƒ”แƒ‘แƒก แƒจแƒ”แƒ•แƒ”แƒฎแƒ”แƒ‘แƒ˜แƒ—, แƒแƒ แƒ˜แƒก แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ•แƒแƒ แƒแƒฃแƒ“แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฃแƒœแƒ“แƒ แƒ’แƒแƒ•แƒแƒ™แƒ”แƒ—แƒแƒ— แƒฉแƒ•แƒ”แƒœแƒก แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ—แƒแƒœ แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒ—. แƒ›แƒ—แƒแƒ•แƒแƒ แƒ˜ แƒจแƒ”แƒ“แƒ”แƒ’แƒ˜, แƒ แƒแƒ›แƒšแƒ˜แƒก แƒ›แƒ˜แƒฆแƒฌแƒ”แƒ•แƒแƒช แƒ’แƒ•แƒ˜แƒœแƒ“แƒ, แƒกแƒแƒ™แƒ›แƒแƒแƒ“ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ.

แƒจแƒ”แƒœแƒ˜แƒจแƒ•แƒœแƒ. แƒ‘แƒ˜แƒ–แƒœแƒ”แƒก PRO-TIP. แƒžแƒ แƒแƒชแƒ”แƒกแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ”แƒ‘แƒแƒ› แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ“แƒแƒ–แƒแƒ’แƒแƒ— แƒ‘แƒ”แƒ•แƒ แƒ˜ แƒคแƒฃแƒšแƒ˜ แƒ›แƒฎแƒแƒ แƒ“แƒแƒญแƒ”แƒ แƒแƒ–แƒ” (แƒ แƒแƒช แƒ›แƒ”แƒขแƒ˜ แƒแƒ“แƒแƒ›แƒ˜แƒแƒœแƒ˜ แƒ’แƒงแƒแƒ•แƒ— แƒ“แƒแƒกแƒแƒฅแƒ›แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ—แƒฅแƒ•แƒ”แƒœแƒก แƒ™แƒแƒ›แƒžแƒแƒœแƒ˜แƒแƒจแƒ˜, แƒ›แƒ˜แƒ— แƒ›แƒ”แƒขแƒ˜ แƒคแƒฃแƒšแƒ˜แƒก แƒ“แƒแƒ–แƒแƒ’แƒ•แƒ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ—)!

แƒแƒ  แƒแƒ แƒ˜แƒก แƒกแƒแƒญแƒ˜แƒ แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒฃแƒ™แƒแƒœ แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ

แƒ”แƒก แƒแƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ”แƒ‘แƒก แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒžแƒ แƒแƒชแƒ”แƒกแƒก (แƒ–แƒแƒ’แƒ˜แƒ”แƒ แƒ—แƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒฃแƒ™แƒแƒœ แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ แƒ—แƒ˜แƒ—แƒฅแƒ›แƒ˜แƒก แƒจแƒ”แƒฃแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ, แƒ แƒแƒ’แƒแƒ แƒ˜แƒชแƒแƒ แƒฌแƒแƒจแƒšแƒ˜แƒก แƒฃแƒ™แƒแƒœ แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ). แƒฉแƒ•แƒ”แƒœ แƒฃแƒ แƒฉแƒ”แƒ•แƒœแƒ˜แƒแƒ— แƒ›แƒฎแƒแƒšแƒแƒ“ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒฃแƒ™แƒแƒœ แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ. แƒแƒ› แƒ’แƒ–แƒ˜แƒ—, แƒ›แƒแƒจแƒ˜แƒœแƒแƒช แƒ™แƒ˜, แƒ—แƒฃ แƒ—แƒฅแƒ•แƒ”แƒœ แƒ’แƒแƒฅแƒ•แƒ— แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ (แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, SQL แƒ“แƒ NoSQL), แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒšแƒกแƒแƒ“แƒ”แƒœแƒ˜ แƒ”แƒ แƒ—แƒœแƒแƒ˜แƒ แƒแƒ“ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒฃแƒ แƒ”แƒ‘แƒ.

แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒฃแƒœแƒ“แƒ แƒ˜แƒงแƒแƒก แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ”แƒ แƒ—แƒ˜ แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒก แƒฃแƒ™แƒแƒœ แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ (แƒแƒ แƒ แƒ›แƒ”แƒขแƒ˜)

แƒฃแƒ™แƒแƒœ แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ แƒฃแƒœแƒ“แƒ แƒ›แƒแƒฎแƒ“แƒ”แƒก แƒ›แƒฎแƒแƒšแƒแƒ“ แƒกแƒแƒญแƒ˜แƒ แƒแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜. แƒ—แƒฃ แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒ•แƒ”แƒ แƒกแƒ˜แƒแƒจแƒ˜ แƒแƒ แƒ˜แƒก แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ“แƒ•แƒ˜แƒšแƒแƒ“ แƒแƒ  แƒ’แƒแƒ›แƒแƒกแƒฌแƒแƒ แƒ“แƒ”แƒ‘แƒ, แƒฉแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒจแƒ”แƒ•แƒซแƒšแƒแƒ— แƒฃแƒแƒฎแƒšแƒ”แƒก แƒกแƒแƒ›แƒฃแƒจแƒแƒ แƒ•แƒ”แƒ แƒกแƒ˜แƒแƒ–แƒ” แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ. แƒฉแƒ•แƒ”แƒœ แƒ•แƒ•แƒแƒ แƒแƒฃแƒ“แƒแƒ‘แƒ—, แƒ แƒแƒ› แƒ”แƒก แƒฃแƒแƒฎแƒšแƒ”แƒกแƒ˜ แƒกแƒแƒ›แƒฃแƒจแƒแƒ แƒ•แƒ”แƒ แƒกแƒ˜แƒ แƒฌแƒ˜แƒœแƒแƒ. แƒ™แƒแƒ“แƒ˜แƒกแƒ แƒ“แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒแƒ“แƒแƒ‘แƒ˜แƒก แƒจแƒ”แƒœแƒแƒ แƒฉแƒฃแƒœแƒ”แƒ‘แƒ แƒ”แƒ แƒ—แƒ–แƒ” แƒ›แƒ”แƒขแƒ˜ แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒซแƒแƒšแƒ˜แƒแƒœ แƒ แƒ—แƒฃแƒšแƒ˜ แƒ“แƒ แƒซแƒ•แƒ˜แƒ แƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ.

แƒจแƒ”แƒœแƒ˜แƒจแƒ•แƒœแƒ. แƒ›แƒ”แƒขแƒ˜ แƒฌแƒแƒ™แƒ˜แƒ—แƒฎแƒ•แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒแƒ› แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ•แƒชแƒ•แƒšแƒ˜แƒ— แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ›แƒ—แƒแƒ•แƒแƒ  แƒ•แƒ”แƒ แƒกแƒ˜แƒแƒก.

แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜ 1: แƒกแƒแƒฌแƒงแƒ˜แƒกแƒ˜ แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ

แƒแƒžแƒ˜แƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒ: 1.0.0
DB แƒ•แƒ”แƒ แƒกแƒ˜แƒ: v1

แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ”แƒ‘แƒ˜

แƒ”แƒก แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒ’แƒแƒœแƒแƒชแƒฎแƒแƒ“แƒ˜แƒก แƒกแƒแƒฌแƒงแƒ˜แƒกแƒ˜ แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ.

แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ แƒ˜แƒชแƒ•แƒšแƒ”แƒ‘แƒ

DB แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒก last_name.

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

แƒ™แƒแƒ“แƒ˜ แƒ˜แƒชแƒ•แƒšแƒ”แƒ‘แƒ

แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ แƒ˜แƒœแƒแƒฎแƒแƒ•แƒก แƒžแƒ˜แƒ แƒแƒ•แƒœแƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒก last_name:

/*
 * Copyright 2012-2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package sample.flyway;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String lastName;

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return this.lastName;
    }

    public void setLastName(String lastname) {
        this.lastName = lastname;
    }

    @Override
    public String toString() {
        return "Person [firstName=" + this.firstName + ", lastName=" + this.lastName
                + "]";
    }
}

แƒกแƒ•แƒ”แƒขแƒ˜แƒก แƒฃแƒ™แƒแƒœ แƒจแƒ”แƒฃแƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒ”แƒšแƒ˜ แƒ’แƒแƒ“แƒแƒ แƒฅแƒ›แƒ”แƒ•แƒ

แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒฎแƒ”แƒ“แƒแƒ— แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒก, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒฃแƒœแƒ“แƒ แƒจแƒ”แƒชแƒ•แƒแƒšแƒแƒ— แƒกแƒ•แƒ”แƒขแƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒ˜:

แƒงแƒฃแƒ แƒแƒ“แƒฆแƒ”แƒ‘แƒ. แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜ แƒ’แƒแƒœแƒ–แƒ แƒแƒฎ แƒแƒ แƒฆแƒ•แƒ”แƒ•แƒก แƒœแƒ˜แƒ•แƒ—แƒ”แƒ‘แƒก. แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒ— แƒแƒ›แƒแƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒแƒ“แƒแƒ‘แƒ˜แƒก แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ˜แƒก แƒ“แƒ”แƒ›แƒแƒœแƒกแƒขแƒ แƒ˜แƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒแƒžแƒ˜แƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒ: 2.0.0.BAD

DB แƒ•แƒ”แƒ แƒกแƒ˜แƒ: v2bad

แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ”แƒ‘แƒ˜

แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜ แƒแƒ  แƒ’แƒ•แƒแƒซแƒšแƒ”แƒ•แƒก แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒ•แƒฃแƒจแƒ•แƒแƒ— แƒแƒ แƒ˜ แƒ˜แƒœแƒกแƒขแƒแƒœแƒชแƒ˜แƒ (แƒซแƒ•แƒ”แƒšแƒ˜ แƒ“แƒ แƒแƒฎแƒแƒšแƒ˜) แƒ”แƒ แƒ—แƒ“แƒ แƒแƒฃแƒšแƒแƒ“. แƒแƒ›แƒ แƒ˜แƒ’แƒแƒ“, แƒœแƒฃแƒšแƒแƒ•แƒแƒœแƒ˜ แƒจแƒ”แƒคแƒ”แƒ แƒฎแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ แƒซแƒœแƒ”แƒšแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ (แƒ—แƒฃ แƒ•แƒแƒ แƒแƒฃแƒ“แƒ”แƒ‘แƒ˜ แƒ’แƒแƒ—แƒ•แƒแƒšแƒ˜แƒกแƒฌแƒ˜แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ, แƒ”แƒก แƒ แƒ”แƒแƒšแƒฃแƒ แƒแƒ“ แƒจแƒ”แƒฃแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ).

A/B แƒขแƒ”แƒกแƒขแƒ˜แƒ แƒ”แƒ‘แƒ

แƒแƒ›แƒŸแƒแƒ›แƒ˜แƒœแƒ“แƒ”แƒšแƒ˜ แƒกแƒ˜แƒขแƒฃแƒแƒชแƒ˜แƒ แƒแƒ แƒ˜แƒก แƒ˜แƒก, แƒ แƒแƒ› แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒแƒฅแƒ•แƒก แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒ 1.0.0, แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒฌแƒแƒ แƒ›แƒแƒ”แƒ‘แƒแƒจแƒ˜ แƒ“แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒจแƒ˜ v1. แƒฉแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ’แƒแƒœแƒ•แƒแƒ—แƒแƒ•แƒกแƒแƒ— แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ›แƒ”แƒแƒ แƒ” แƒ˜แƒœแƒกแƒขแƒแƒœแƒชแƒ˜แƒ, แƒ•แƒ”แƒ แƒกแƒ˜แƒ 2.0.0.BADแƒ“แƒ แƒ’แƒแƒœแƒแƒแƒฎแƒšแƒ”แƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ v2bad.

แƒœแƒแƒ‘แƒ˜แƒฏแƒ”แƒ‘แƒ˜:

  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 แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒ›แƒชแƒ“แƒ”แƒšแƒแƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ (แƒ“แƒแƒแƒฎแƒš. แƒžแƒ”แƒ .: แƒแƒ•แƒขแƒแƒ แƒ˜ แƒแƒฅ แƒแƒšแƒ‘แƒแƒ— A/B แƒขแƒ”แƒกแƒขแƒ˜แƒ แƒ”แƒ‘แƒแƒก แƒ’แƒฃแƒšแƒ˜แƒกแƒฎแƒ›แƒแƒ‘แƒ“แƒ) แƒ’แƒแƒ“แƒแƒ•แƒฌแƒงแƒ•แƒ˜แƒขแƒ”แƒ—, แƒ แƒแƒ› แƒฃแƒœแƒ“แƒ แƒ“แƒแƒ•แƒแƒ‘แƒ แƒฃแƒœแƒแƒ— แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ แƒ•แƒ”แƒ แƒกแƒ˜แƒแƒ–แƒ” 1.0.0. แƒ•แƒ—แƒฅแƒ•แƒแƒ—, แƒ แƒแƒ› แƒแƒ  แƒ’แƒ•แƒ˜แƒœแƒ“แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒฃแƒ™แƒแƒœ แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ.

แƒœแƒแƒ‘แƒ˜แƒฏแƒ”แƒ‘แƒ˜:

  1. แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒฉแƒ”แƒ แƒ”แƒ‘แƒ— แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒก แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒก 2.0.0.BAD
  2. แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ แƒฏแƒ”แƒ  แƒ™แƒ˜แƒ“แƒ”แƒ• แƒแƒ แƒ˜แƒก v2bad
  3. แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒ“แƒแƒœ แƒ›แƒแƒงแƒแƒšแƒ”แƒ‘แƒฃแƒšแƒ˜ 1.0.0 แƒแƒ  แƒ”แƒกแƒ›แƒ˜แƒก แƒ แƒ แƒแƒ แƒ˜แƒก surname, แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒก แƒ“แƒแƒ•แƒ˜แƒœแƒแƒฎแƒแƒ•แƒ—
  4. แƒฏแƒแƒฏแƒแƒฎแƒ”แƒ—แƒ˜ แƒ“แƒแƒ˜แƒจแƒแƒšแƒ, แƒฉแƒ•แƒ”แƒœ แƒฃแƒ™แƒแƒœ แƒ•แƒ”แƒฆแƒแƒ  แƒ“แƒแƒ•แƒ‘แƒ แƒฃแƒœแƒ“แƒ”แƒ‘แƒ˜แƒ—

แƒ แƒแƒ’แƒแƒ แƒช แƒฎแƒ”แƒ“แƒแƒ•แƒ—, แƒ—แƒฃ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒกแƒ แƒ“แƒ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒแƒจแƒ˜ แƒฃแƒ™แƒฃแƒฆแƒ›แƒ แƒจแƒ”แƒฃแƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒ”แƒš แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒก แƒ•แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒ—, แƒฌแƒ˜แƒœแƒ แƒ•แƒ”แƒ แƒกแƒ˜แƒแƒ–แƒ” แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒแƒก แƒ•แƒ”แƒ  แƒจแƒ”แƒ•แƒซแƒšแƒ”แƒ‘แƒ—.

แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜แƒก แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒŸแƒฃแƒ แƒœแƒแƒšแƒ”แƒ‘แƒ˜

Backward incompatible scenario:

01) Run 1.0.0
02) Wait for the app (1.0.0) to boot
03) Generate a person by calling POST localhost:9991/person to version 1.0.0
04) Run 2.0.0.BAD
05) Wait for the app (2.0.0.BAD) to boot
06) Generate a person by calling POST localhost:9991/person to version 1.0.0 <-- this should fail
07) Generate a person by calling POST localhost:9992/person to version 2.0.0.BAD <-- this should pass

Starting app in version 1.0.0
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

{"firstName":"b73f639f-e176-4463-bf26-1135aace2f57","lastName":"b73f639f-e176-4463-bf26-1135aace2f57"}

Starting app in version 2.0.0.BAD
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

curl: (22) The requested URL returned error: 500 Internal Server Error

Generate a person in version 2.0.0.BAD
Sending a post to 127.0.0.1:9995/person. This is the response:

{"firstName":"e156be2e-06b6-4730-9c43-6e14cfcda125","surname":"e156be2e-06b6-4730-9c43-6e14cfcda125"}

แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ แƒ˜แƒชแƒ•แƒšแƒ”แƒ‘แƒ

แƒ›แƒ˜แƒ’แƒ แƒแƒชแƒ˜แƒ˜แƒก แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ’แƒแƒ“แƒแƒ แƒฅแƒ›แƒ”แƒ•แƒก last_name ะฒ surname

แƒฌแƒงแƒแƒ แƒ Flyway แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜:

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ’แƒแƒ“แƒแƒ แƒฅแƒ›แƒ”แƒ•แƒก last_name.

-- This change is backward incompatible - you can't do A/B testing
ALTER TABLE PERSON CHANGE last_name surname VARCHAR;

แƒ™แƒแƒ“แƒ˜ แƒ˜แƒชแƒ•แƒšแƒ”แƒ‘แƒ

แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ•แƒชแƒ•แƒแƒšแƒ”แƒ— แƒ•แƒ”แƒšแƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒ˜ lastName on surname.

แƒกแƒ•แƒ”แƒขแƒ˜แƒก แƒ’แƒแƒ“แƒแƒ แƒฅแƒ›แƒ”แƒ•แƒ แƒฃแƒ™แƒฃแƒฆแƒ›แƒ แƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒแƒ“แƒ˜ แƒ’แƒ–แƒ˜แƒ—

แƒ”แƒก แƒแƒ แƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒ’แƒแƒ•แƒ แƒชแƒ”แƒšแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒกแƒ˜แƒขแƒฃแƒแƒชแƒ˜แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒจแƒ”แƒ’แƒ•แƒฎแƒ•แƒ“แƒ”แƒก. แƒฉแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ’แƒแƒœแƒ•แƒแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒแƒ— แƒฃแƒ™แƒฃแƒฆแƒ›แƒ แƒจแƒ”แƒฃแƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒ”แƒšแƒ˜ แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜. แƒฉแƒ•แƒ”แƒœ แƒฃแƒ™แƒ•แƒ” แƒ“แƒแƒ•แƒแƒ›แƒขแƒ™แƒ˜แƒชแƒ”แƒ—, แƒ แƒแƒ› แƒœแƒฃแƒšแƒแƒ•แƒแƒœแƒ˜ แƒจแƒ”แƒคแƒ”แƒ แƒฎแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒฉแƒ•แƒ”แƒœ แƒแƒ  แƒฃแƒœแƒ“แƒ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒแƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒ›แƒ˜แƒ’แƒ แƒแƒชแƒ˜แƒ แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒœแƒแƒ‘แƒ˜แƒฏแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”. แƒกแƒขแƒแƒขแƒ˜แƒ˜แƒก แƒแƒ› แƒœแƒแƒฌแƒ˜แƒšแƒจแƒ˜ แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ•แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ— แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก 3 แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒแƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒ›แƒ˜แƒ’แƒ แƒแƒชแƒ˜แƒ”แƒ‘แƒ—แƒแƒœ แƒ”แƒ แƒ—แƒแƒ“, แƒ แƒแƒ—แƒ แƒ›แƒ˜แƒ•แƒแƒฆแƒฌแƒ˜แƒแƒ— แƒกแƒแƒกแƒฃแƒ แƒ•แƒ”แƒš แƒจแƒ”แƒ“แƒ”แƒ’แƒก แƒ“แƒ แƒจแƒ”แƒ•แƒ˜แƒœแƒแƒ แƒฉแƒฃแƒœแƒแƒ— แƒฃแƒ™แƒแƒœ แƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒแƒ“แƒแƒ‘แƒ.

แƒจแƒ”แƒœแƒ˜แƒจแƒ•แƒœแƒ. แƒจแƒ”แƒ’แƒแƒฎแƒกแƒ”แƒœแƒ”แƒ‘แƒ—, แƒ แƒแƒ› แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒแƒฅแƒ•แƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ v1. แƒ˜แƒก แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒก แƒกแƒ•แƒ”แƒขแƒ”แƒ‘แƒก first_name ะธ last_name. แƒฉแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒจแƒ”แƒ•แƒ˜แƒชแƒ•แƒแƒšแƒแƒ— last_name on surname. แƒฉแƒ•แƒ”แƒœ แƒแƒกแƒ”แƒ•แƒ” แƒ’แƒ•แƒแƒฅแƒ•แƒก แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒ 1.0.0, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฏแƒ”แƒ  แƒแƒ  แƒแƒ แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ surname.

แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜ 2: แƒ“แƒแƒแƒ›แƒแƒขแƒ”แƒ— แƒ’แƒ•แƒแƒ แƒ˜

แƒแƒžแƒ˜แƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒ: 2.0.0
DB แƒ•แƒ”แƒ แƒกแƒ˜แƒ: v2

แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ”แƒ‘แƒ˜

แƒแƒฎแƒแƒšแƒ˜ แƒกแƒ•แƒ”แƒขแƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ— แƒ“แƒ แƒ›แƒ˜แƒกแƒ˜ แƒจแƒ˜แƒ’แƒ—แƒแƒ•แƒกแƒ˜แƒก แƒ™แƒแƒžแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒ—, แƒฉแƒ•แƒ”แƒœ แƒ•แƒฅแƒ›แƒœแƒ˜แƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒก. แƒแƒ›แƒแƒ•แƒ“แƒ แƒแƒฃแƒšแƒแƒ“, แƒ—แƒฃ แƒฉแƒ•แƒ”แƒœ แƒ“แƒแƒ•แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ— JAR-แƒก แƒแƒœ แƒ’แƒ•แƒแƒฅแƒ•แƒก แƒซแƒ•แƒ”แƒšแƒ˜ JAR แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜, แƒ˜แƒก แƒแƒ  แƒ’แƒแƒขแƒงแƒ“แƒ”แƒ‘แƒ แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒ“แƒ แƒแƒก.

แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ›แƒแƒ•แƒแƒฅแƒ•แƒ”แƒงแƒœแƒ”แƒ‘แƒ— แƒแƒฎแƒแƒš แƒ•แƒ”แƒ แƒกแƒ˜แƒแƒก

แƒœแƒแƒ‘แƒ˜แƒฏแƒ”แƒ‘แƒ˜:

  1. แƒจแƒ”แƒแƒกแƒ แƒฃแƒšแƒ”แƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒ›แƒ˜แƒ’แƒ แƒแƒชแƒ˜แƒ แƒแƒฎแƒแƒšแƒ˜ แƒกแƒ•แƒ”แƒขแƒ˜แƒก แƒจแƒ”แƒกแƒแƒฅแƒ›แƒœแƒ”แƒšแƒแƒ“ surname. แƒแƒฎแƒšแƒ แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ DB แƒ•แƒ”แƒ แƒกแƒ˜แƒ v2
  2. แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒ™แƒแƒžแƒ˜แƒ แƒ”แƒ‘แƒ last_name ะฒ surname. แƒจแƒ”แƒœแƒ˜แƒจแƒ•แƒœแƒแƒ แƒแƒ› แƒ—แƒฃ แƒ—แƒฅแƒ•แƒ”แƒœ แƒ’แƒแƒฅแƒ•แƒ— แƒ‘แƒ”แƒ•แƒ แƒ˜ แƒ”แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ˜, แƒฃแƒœแƒ“แƒ แƒ’แƒแƒ˜แƒ—แƒ•แƒแƒšแƒ˜แƒกแƒฌแƒ˜แƒœแƒแƒ— แƒกแƒ”แƒ แƒ˜แƒฃแƒšแƒ˜ แƒ›แƒ˜แƒ’แƒ แƒแƒชแƒ˜แƒ!
  3. แƒ“แƒแƒฌแƒ”แƒ แƒ”แƒ— แƒ™แƒแƒ“แƒ˜, แƒกแƒแƒ“แƒแƒช แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒแƒ แƒ˜แƒ•แƒ” ะธ แƒแƒฎแƒแƒšแƒ˜แƒ“แƒ แƒซแƒ•แƒ”แƒšแƒ˜ แƒกแƒ•แƒ”แƒขแƒ˜. แƒแƒฎแƒšแƒ แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒ 2.0.0
  4. แƒฌแƒแƒ˜แƒ™แƒ˜แƒ—แƒฎแƒ”แƒ— แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ แƒกแƒ•แƒ”แƒขแƒ˜แƒ“แƒแƒœ surname, แƒ—แƒฃ แƒแƒ  แƒแƒ แƒ˜แƒก null, แƒแƒœ แƒšast_nameแƒ—แƒฃ surname แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก. แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒฌแƒแƒจแƒแƒšแƒแƒ— getLastName() แƒ™แƒแƒ“แƒ˜แƒ“แƒแƒœ, แƒ แƒแƒ“แƒ’แƒแƒœ แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ•แƒ null แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒ’แƒแƒœแƒแƒชแƒฎแƒแƒ“แƒ˜แƒก แƒฃแƒ™แƒแƒœ แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ˜แƒกแƒแƒก 3.0.0 แƒ“แƒแƒœ 2.0.0.

แƒ—แƒฃ แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— Spring Boot Flyway-แƒก, แƒ”แƒก แƒแƒ แƒ˜ แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜ แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ“แƒ”แƒ‘แƒ แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒ“แƒ แƒแƒก 2.0.0 แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜. แƒ—แƒฃ แƒ—แƒฅแƒ•แƒ”แƒœ แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒฎแƒ”แƒšแƒกแƒแƒฌแƒงแƒแƒก แƒฎแƒ”แƒšแƒ˜แƒ—, แƒแƒ›แƒ˜แƒกแƒแƒ—แƒ•แƒ˜แƒก แƒ›แƒแƒ’แƒ˜แƒฌแƒ”แƒ•แƒ— แƒแƒ แƒ˜ แƒ’แƒแƒœแƒกแƒฎแƒ•แƒแƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒแƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒ (แƒฏแƒ”แƒ  แƒ’แƒแƒœแƒแƒแƒฎแƒšแƒ”แƒ— db แƒ•แƒ”แƒ แƒกแƒ˜แƒ แƒฎแƒ”แƒšแƒ˜แƒ— แƒ“แƒ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ’แƒแƒœแƒแƒ—แƒแƒ•แƒกแƒ”แƒ— แƒแƒฎแƒแƒšแƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ).

แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœแƒ˜แƒ. แƒ’แƒแƒฎแƒกแƒแƒ•แƒ“แƒ”แƒ—, แƒ แƒแƒ› แƒแƒฎแƒšแƒแƒ“ แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒšแƒ˜ แƒกแƒ•แƒ”แƒขแƒ˜ แฒแฒ  แฒฃแฒœแฒ“แฒ แƒ˜แƒงแƒแƒก NULL แƒแƒ  แƒแƒ แƒ˜แƒก. แƒ—แƒฃ แƒ“แƒแƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ—, แƒซแƒ•แƒ”แƒšแƒ›แƒ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒแƒ› แƒแƒ  แƒ˜แƒชแƒ˜แƒก แƒแƒฎแƒแƒšแƒ˜ แƒกแƒ•แƒ”แƒขแƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒ“แƒ แƒแƒ  แƒ“แƒแƒแƒ˜แƒœแƒกแƒขแƒแƒšแƒ˜แƒ แƒ”แƒ‘แƒก แƒ›แƒแƒก Insert. แƒ›แƒแƒ’แƒ แƒแƒ› แƒ—แƒฃ แƒ“แƒแƒแƒ›แƒแƒขแƒ”แƒ‘แƒ— แƒแƒ› แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒ•แƒแƒก แƒ“แƒ แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ db แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ v2, แƒ”แƒก แƒ›แƒแƒ˜แƒ—แƒฎแƒแƒ•แƒก แƒแƒฎแƒแƒšแƒ˜ แƒกแƒ•แƒ”แƒขแƒ˜แƒก แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ˜แƒก แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒแƒก. แƒ แƒแƒช แƒ’แƒแƒ›แƒแƒ˜แƒฌแƒ•แƒ”แƒ•แƒก แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒ•แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ แƒฆแƒ•แƒ”แƒ•แƒแƒก.

แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœแƒ˜แƒ. แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒแƒ›แƒแƒ˜แƒฆแƒแƒ— แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ getLastName(), แƒ แƒแƒ“แƒ’แƒแƒœ แƒ•แƒ”แƒ แƒกแƒ˜แƒแƒจแƒ˜ 3.0.0 แƒ™แƒแƒ“แƒจแƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก แƒกแƒ•แƒ”แƒขแƒ˜แƒก แƒ™แƒแƒœแƒชแƒ”แƒคแƒชแƒ˜แƒ last_name. แƒ”แƒก แƒœแƒ˜แƒจแƒœแƒแƒ•แƒก, แƒ แƒแƒ› แƒ˜แƒฅ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ null แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ. แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ“แƒแƒขแƒแƒ•แƒแƒ— แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒ“แƒ แƒ“แƒแƒแƒ›แƒแƒขแƒแƒ— แƒฉแƒ”แƒ™แƒ”แƒ‘แƒ˜ null, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ‘แƒ”แƒ•แƒ แƒแƒ“ แƒฃแƒ™แƒ”แƒ—แƒ”แƒกแƒ˜ แƒ’แƒแƒ›แƒแƒกแƒแƒ•แƒแƒšแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒšแƒแƒ’แƒ˜แƒ™แƒแƒจแƒ˜ แƒ“แƒแƒ แƒฌแƒ›แƒฃแƒœแƒ“แƒ”แƒ— getSurname() แƒ—แƒฅแƒ•แƒ”แƒœ แƒแƒ˜แƒ แƒฉแƒ˜แƒ”แƒ— แƒกแƒฌแƒแƒ แƒ˜ แƒแƒ แƒ-แƒœแƒฃแƒšแƒแƒ•แƒแƒœแƒ˜ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ.

A/B แƒขแƒ”แƒกแƒขแƒ˜แƒ แƒ”แƒ‘แƒ

แƒแƒ›แƒŸแƒแƒ›แƒ˜แƒœแƒ“แƒ”แƒšแƒ˜ แƒกแƒ˜แƒขแƒฃแƒแƒชแƒ˜แƒ แƒแƒ แƒ˜แƒก แƒ˜แƒก, แƒ แƒแƒ› แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒแƒฅแƒ•แƒก แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒ 1.0.0, แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒฌแƒแƒ แƒ›แƒแƒ”แƒ‘แƒแƒ–แƒ” แƒ“แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒจแƒ˜ v1. แƒฉแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ’แƒแƒœแƒ•แƒแƒ—แƒแƒ•แƒกแƒแƒ— แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒก แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ›แƒ”แƒแƒ แƒ” แƒ˜แƒœแƒกแƒขแƒแƒœแƒชแƒ˜แƒ 2.0.0แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ’แƒแƒœแƒแƒแƒฎแƒšแƒ”แƒ‘แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒก v2.

แƒœแƒแƒ‘แƒ˜แƒฏแƒ”แƒ‘แƒ˜:

  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 แƒกแƒ•แƒ”แƒขแƒ˜) แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ’แƒฅแƒแƒœแƒ“แƒ”แƒ— แƒแƒ แƒแƒ—แƒแƒœแƒ›แƒ˜แƒ›แƒ“แƒ”แƒ•แƒ แƒฃแƒšแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜, แƒ—แƒฃ แƒ—แƒฅแƒ•แƒ”แƒœ แƒ›แƒแƒ˜แƒ—แƒฎแƒแƒ•แƒ— แƒแƒฎแƒแƒš แƒกแƒ•แƒ”แƒขแƒก.

แƒ’แƒแƒœแƒแƒชแƒฎแƒแƒ“แƒ˜แƒก แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ

แƒแƒฎแƒšแƒ แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒแƒฅแƒ•แƒก แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒ 2.0.0 แƒ“แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒจแƒ˜ v2.

แƒœแƒแƒ‘แƒ˜แƒฏแƒ”แƒ‘แƒ˜:

  1. แƒ“แƒแƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ— แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ แƒ•แƒ”แƒ แƒกแƒ˜แƒแƒ–แƒ” 1.0.0.
  2. แƒ•แƒ”แƒ แƒกแƒ˜แƒ 1.0.0 แƒแƒ  แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก แƒกแƒ•แƒ”แƒขแƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒจแƒ˜ surnameแƒแƒกแƒ” แƒ แƒแƒ›, แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ แƒฌแƒแƒ แƒ›แƒแƒขแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒฃแƒœแƒ“แƒ แƒ˜แƒงแƒแƒก

DB แƒ˜แƒชแƒ•แƒšแƒ”แƒ‘แƒ

แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒก แƒกแƒ•แƒ”แƒขแƒก แƒกแƒแƒฎแƒ”แƒšแƒแƒ“ last_name.

Flyway แƒฌแƒงแƒแƒ แƒแƒก แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜:

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ surname.

แƒงแƒฃแƒ แƒแƒ“แƒฆแƒ”แƒ‘แƒ. แƒ’แƒแƒฎแƒกแƒแƒ•แƒ“แƒ”แƒ—, แƒ แƒแƒ› แƒ—แƒฅแƒ•แƒ”แƒœ แƒแƒ  แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ“แƒแƒแƒ›แƒแƒขแƒแƒ— NOT NULL แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒ•แƒ”แƒ‘แƒ˜ แƒกแƒ•แƒ”แƒขแƒจแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ—. แƒ—แƒฃ JAR-แƒก แƒ“แƒแƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ—, แƒซแƒ•แƒ”แƒš แƒ•แƒ”แƒ แƒกแƒ˜แƒแƒก แƒฌแƒแƒ แƒ›แƒแƒ“แƒ’แƒ”แƒœแƒ แƒแƒ  แƒ”แƒฅแƒœแƒ”แƒ‘แƒ แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒกแƒ•แƒ”แƒขแƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒ“แƒ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒฃแƒ แƒแƒ“ แƒ“แƒแƒแƒงแƒ”แƒœแƒ”แƒ‘แƒก แƒ›แƒแƒก NULL-แƒ–แƒ”. แƒ—แƒฃ แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒแƒกแƒ”แƒ—แƒ˜ แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒ•แƒ, แƒซแƒ•แƒ”แƒšแƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒ˜แƒจแƒšแƒ”แƒ‘แƒ.

-- NOTE: This field can't have the NOT NULL constraint cause if you rollback, the old version won't know about this field
-- and will always set it to NULL
ALTER TABLE PERSON ADD surname varchar(255);

-- WE'RE ASSUMING THAT IT'S A FAST MIGRATION - OTHERWISE WE WOULD HAVE TO MIGRATE IN BATCHES
UPDATE PERSON SET PERSON.surname = PERSON.last_name

แƒ™แƒแƒ“แƒ˜ แƒ˜แƒชแƒ•แƒšแƒ”แƒ‘แƒ

แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒœแƒแƒฎแƒแƒ•แƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒก แƒ แƒแƒ’แƒแƒ แƒช last_name, แƒ“แƒ surname. แƒแƒ›แƒแƒ•แƒ” แƒ“แƒ แƒแƒก แƒ•แƒ™แƒ˜แƒ—แƒฎแƒฃแƒšแƒแƒ‘แƒ— last_name, แƒ แƒแƒ“แƒ’แƒแƒœ แƒ”แƒก แƒกแƒ•แƒ”แƒขแƒ˜ แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒแƒฅแƒขแƒฃแƒแƒšแƒฃแƒ แƒ˜แƒ. แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒžแƒ แƒแƒชแƒ”แƒกแƒจแƒ˜, แƒ–แƒแƒ’แƒ˜แƒ”แƒ แƒ—แƒ˜ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ“แƒ”แƒก แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ˜แƒœแƒกแƒขแƒแƒœแƒชแƒ˜แƒ˜แƒก แƒ›แƒ˜แƒ”แƒ , แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฏแƒ”แƒ  แƒแƒ  แƒแƒ แƒ˜แƒก แƒ’แƒแƒœแƒแƒฎแƒšแƒ”แƒ‘แƒฃแƒšแƒ˜.

/*
 * Copyright 2012-2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package sample.flyway;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String lastName;
    private String surname;

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    /**
     * Reading from the new column if it's set. If not the from the old one.
     *
     * When migrating from version 1.0.0 -> 2.0.0 this can lead to a possibility that some data in
     * the surname column is not up to date (during the migration process lastName could have been updated).
     * In this case one can run yet another migration script after all applications have been deployed in the
     * new version to ensure that the surname field is updated.
     *
     * However it makes sense since when looking at the migration from 2.0.0 -> 3.0.0. In 3.0.0 we no longer
     * have a notion of lastName at all - so we don't update that column. If we rollback from 3.0.0 -> 2.0.0 if we
     * would be reading from lastName, then we would have very old data (since not a single datum was inserted
     * to lastName in version 3.0.0).
     */
    public String getSurname() {
        return this.surname != null ? this.surname : this.lastName;
    }

    /**
     * Storing both FIRST_NAME and SURNAME entries
     */
    public void setSurname(String surname) {
        this.lastName = surname;
        this.surname = surname;
    }

    @Override
    public String toString() {
        return "Person [firstName=" + this.firstName + ", lastName=" + this.lastName + ", surname=" + this.surname
                + "]";
    }
}

แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜ 3: แƒ’แƒ•แƒแƒ แƒ˜แƒก แƒแƒ›แƒแƒฆแƒ”แƒ‘แƒ แƒ™แƒแƒ“แƒ˜แƒ“แƒแƒœ

แƒแƒžแƒ˜แƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒ: 3.0.0

DB แƒ•แƒ”แƒ แƒกแƒ˜แƒ:v3

แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ”แƒ‘แƒ˜

แƒจแƒ”แƒœแƒ˜แƒจแƒ•แƒœแƒ แƒžแƒ”แƒ .: แƒ แƒแƒ’แƒแƒ แƒช แƒฉแƒแƒœแƒก, แƒ—แƒแƒ•แƒ“แƒแƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ แƒแƒ•แƒขแƒแƒ แƒ›แƒ แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ˜แƒ— แƒ“แƒแƒแƒ™แƒแƒžแƒ˜แƒ แƒ แƒแƒ› แƒ‘แƒšแƒแƒ™แƒ˜แƒก แƒขแƒ”แƒฅแƒกแƒขแƒ˜ แƒ›แƒ”-2 แƒกแƒแƒคแƒ”แƒฎแƒฃแƒ แƒ˜แƒ“แƒแƒœ. แƒแƒ› แƒ”แƒขแƒแƒžแƒ–แƒ” แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜ แƒฃแƒœแƒ“แƒ แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ“แƒ”แƒก แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ™แƒแƒ“แƒจแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ›แƒ˜แƒ–แƒœแƒแƒ“ แƒ˜แƒกแƒแƒฎแƒแƒ•แƒก แƒ˜แƒ› แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒก แƒแƒ›แƒแƒฆแƒ”แƒ‘แƒแƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก แƒกแƒ•แƒ”แƒขแƒก. last_name.

แƒแƒฎแƒแƒšแƒ˜ แƒกแƒ•แƒ”แƒขแƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ— แƒ“แƒ แƒ›แƒ˜แƒกแƒ˜ แƒจแƒ˜แƒ’แƒ—แƒแƒ•แƒกแƒ˜แƒก แƒ™แƒแƒžแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒ—, แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ•แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒฃแƒ™แƒแƒœ แƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒแƒ“แƒ˜ แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜. แƒแƒกแƒ”แƒ•แƒ”, แƒ—แƒฃ แƒฉแƒ•แƒ”แƒœ แƒ“แƒแƒ•แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ— JAR-แƒก แƒแƒœ แƒ’แƒ•แƒแƒฅแƒ•แƒก แƒซแƒ•แƒ”แƒšแƒ˜ JAR แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜, แƒ˜แƒก แƒแƒ  แƒ’แƒแƒขแƒงแƒ“แƒ”แƒ‘แƒ แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒ“แƒ แƒแƒก.

แƒ’แƒแƒœแƒแƒชแƒฎแƒแƒ“แƒ˜แƒก แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ

แƒแƒ›แƒŸแƒแƒ›แƒแƒ“ แƒ’แƒ•แƒแƒฅแƒ•แƒก แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒ 3.0.0 แƒ“แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ v3. แƒ•แƒ”แƒ แƒกแƒ˜แƒ 3.0.0 แƒแƒ  แƒ˜แƒœแƒแƒฎแƒแƒ•แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒก last_name. แƒ”แƒก แƒœแƒ˜แƒจแƒœแƒแƒ•แƒก, แƒ แƒแƒ› แƒจแƒ˜ surname แƒ˜แƒœแƒแƒฎแƒ”แƒ‘แƒ แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒฃแƒแƒฎแƒšแƒ”แƒกแƒ˜ แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ.

แƒœแƒแƒ‘แƒ˜แƒฏแƒ”แƒ‘แƒ˜:

  1. แƒ“แƒแƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ— แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ แƒ•แƒ”แƒ แƒกแƒ˜แƒแƒ–แƒ” 2.0.0.
  2. แƒ•แƒ”แƒ แƒกแƒ˜แƒ 2.0.0 แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก แƒ“แƒ last_name ะธ surname.
  3. แƒ•แƒ”แƒ แƒกแƒ˜แƒ 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. แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒก แƒ’แƒแƒœแƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒ 1.0.0 ั v1 แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒกแƒฅแƒ”แƒ›แƒ (แƒกแƒ•แƒ”แƒขแƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒ˜ = last_name)
  2. แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒก แƒ’แƒแƒœแƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒ 2.0.0, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ˜แƒœแƒแƒฎแƒแƒ•แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒก last_name ะธ surname. แƒ’แƒแƒœแƒชแƒฎแƒแƒ“แƒ”แƒ‘แƒแƒจแƒ˜ แƒœแƒแƒ—แƒฅแƒ•แƒแƒ›แƒ˜แƒ last_name. แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ แƒแƒ แƒ˜แƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒแƒจแƒ˜ v2แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒก แƒกแƒ•แƒ”แƒขแƒ”แƒ‘แƒก, แƒ แƒแƒ’แƒแƒ แƒ˜แƒชแƒแƒ last_nameแƒ“แƒ surname. surname แƒแƒกแƒšแƒ˜แƒ แƒšast_name. (แƒจแƒ”แƒœแƒ˜แƒจแƒ•แƒœแƒ: แƒแƒ› แƒกแƒ•แƒ”แƒขแƒก แƒแƒ  แƒฃแƒœแƒ“แƒ แƒฐแƒฅแƒแƒœแƒ“แƒ”แƒก แƒœแƒฃแƒšแƒแƒ•แƒแƒœแƒ˜ แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒ•แƒ)
  3. แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒก แƒ’แƒแƒœแƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒ 3.0.0, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒก แƒ˜แƒœแƒแƒฎแƒแƒ•แƒก surname แƒ“แƒ แƒ’แƒ•แƒแƒ แƒ˜แƒ“แƒแƒœ แƒ™แƒ˜แƒ—แƒฎแƒฃแƒšแƒแƒ‘แƒก. แƒ แƒแƒช แƒจแƒ”แƒ”แƒฎแƒ”แƒ‘แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒก, แƒ‘แƒแƒšแƒ แƒ›แƒ˜แƒ’แƒ แƒแƒชแƒ˜แƒ แƒฎแƒ“แƒ”แƒ‘แƒ last_name ะฒ surname. แƒแƒกแƒ”แƒ•แƒ” แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒ•แƒ NULL แƒแƒ  แƒแƒ แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ•แƒแƒœแƒ˜แƒšแƒ˜แƒ last_name. แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ แƒแƒฎแƒšแƒ แƒ•แƒ”แƒ แƒกแƒ˜แƒแƒจแƒ˜แƒ v3
  4. แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒก แƒ’แƒแƒœแƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒ 4.0.0 - แƒ™แƒแƒ“แƒจแƒ˜ แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก แƒจแƒ”แƒขแƒแƒœแƒ˜แƒšแƒ˜. แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ v4, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒจแƒšแƒ˜แƒก last_name. แƒแƒฅ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ“แƒแƒแƒ›แƒแƒขแƒแƒ— แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ แƒ˜ แƒ’แƒแƒ›แƒแƒขแƒแƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒ•แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒจแƒ˜.

แƒแƒ› แƒ›แƒ˜แƒ“แƒ’แƒแƒ›แƒ˜แƒก แƒ“แƒแƒชแƒ•แƒ˜แƒ—, แƒ—แƒฅแƒ•แƒ”แƒœ แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ“แƒแƒแƒ‘แƒ แƒฃแƒœแƒแƒ— แƒ”แƒ แƒ—แƒ˜ แƒ•แƒ”แƒ แƒกแƒ˜แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก/แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒแƒ“แƒแƒ‘แƒ˜แƒก แƒ“แƒแƒ แƒฆแƒ•แƒ”แƒ•แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”.

แƒ™แƒแƒ“แƒ˜

แƒแƒ› แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒงแƒ•แƒ”แƒšแƒ แƒ™แƒแƒ“แƒ˜ แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒ แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ–แƒ” Github. แƒฅแƒ•แƒ”แƒ›แƒแƒ— แƒ›แƒแƒชแƒ”แƒ›แƒฃแƒšแƒ˜แƒ แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒแƒฆแƒฌแƒ”แƒ แƒ.

แƒžแƒ แƒแƒ”แƒฅแƒขแƒ”แƒ‘แƒ˜

แƒกแƒแƒชแƒแƒ•แƒ˜แƒก แƒ™แƒšแƒแƒœแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒœแƒแƒฎแƒแƒ•แƒ— แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒแƒก.

โ”œโ”€โ”€ boot-flyway-v1              - 1.0.0 version of the app with v1 of the schema
โ”œโ”€โ”€ boot-flyway-v2              - 2.0.0 version of the app with v2 of the schema (backward-compatible - app can be rolled back)
โ”œโ”€โ”€ boot-flyway-v2-bad          - 2.0.0.BAD version of the app with v2bad of the schema (backward-incompatible - app cannot be rolled back)
โ”œโ”€โ”€ boot-flyway-v3              - 3.0.0 version of the app with v3 of the schema (app can be rolled back)
โ””โ”€โ”€ boot-flyway-v4              - 4.0.0 version of the app with v4 of the schema (app can be rolled back)

แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ”แƒ‘แƒ˜

แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ’แƒแƒฃแƒจแƒ•แƒแƒ— แƒฅแƒ•แƒ”แƒ›แƒแƒ— แƒ›แƒแƒชแƒ”แƒ›แƒฃแƒš แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ”แƒ‘แƒจแƒ˜ แƒแƒฆแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜ แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒ”แƒœ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒฃแƒ™แƒแƒœ แƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒแƒ“ แƒ“แƒ แƒจแƒ”แƒฃแƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒ”แƒš แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒก.

แƒกแƒแƒœแƒแƒฎแƒแƒ•แƒแƒ“ แƒกแƒแƒฅแƒ›แƒ” แƒฃแƒ™แƒฃแƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒแƒ“แƒ˜ แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒ—, แƒ’แƒแƒฃแƒจแƒ•แƒ˜แƒ—:

./scripts/scenario_backward_compatible.sh

แƒ“แƒ แƒกแƒแƒœแƒแƒฎแƒแƒ•แƒแƒ“ แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ แƒฃแƒ™แƒฃแƒฆแƒ›แƒ แƒจแƒ”แƒฃแƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒ”แƒšแƒ˜ แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒ—, แƒ’แƒแƒฃแƒจแƒ•แƒ˜แƒ—:

./scripts/scenario_backward_incompatible.sh

แƒกแƒแƒ’แƒแƒ–แƒแƒคแƒฎแƒฃแƒšแƒ แƒฉแƒ”แƒฅแƒ›แƒ˜แƒก แƒœแƒ˜แƒ›แƒฃแƒจแƒ˜ Flyway

แƒงแƒ•แƒ”แƒšแƒ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜ แƒแƒฆแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ Spring Boot Sample Flyway.

แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ’แƒแƒ“แƒแƒฎแƒ”แƒ“แƒแƒ— http://localhost:8080/flyway, แƒแƒ แƒ˜แƒก แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ”แƒ‘แƒ˜แƒก แƒกแƒ˜แƒ.

แƒ”แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜ แƒแƒกแƒ”แƒ•แƒ” แƒ›แƒแƒ˜แƒชแƒแƒ•แƒก H2 แƒ™แƒแƒœแƒกแƒแƒšแƒก (at http://localhost:8080/h2-console) แƒแƒกแƒ” แƒ แƒแƒ› แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒœแƒแƒฎแƒแƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒกแƒขแƒแƒขแƒฃแƒกแƒ˜ (แƒœแƒแƒ’แƒฃแƒšแƒ˜แƒกแƒฎแƒ›แƒ”แƒ•แƒ˜ jdbc URL แƒแƒ แƒ˜แƒก jdbc:h2:mem:testdb).

แƒ’แƒแƒ แƒ“แƒ แƒแƒ›แƒ˜แƒกแƒ

แƒแƒกแƒ”แƒ•แƒ” แƒฌแƒแƒ˜แƒ™แƒ˜แƒ—แƒฎแƒ”แƒ— แƒกแƒฎแƒ•แƒ แƒกแƒขแƒแƒขแƒ˜แƒ”แƒ‘แƒ˜ แƒฉแƒ•แƒ”แƒœแƒก แƒ‘แƒšแƒแƒ’แƒ–แƒ”:

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ