ื ื•ืœ ื“ืึทื•ื ื˜ื™ื™ื ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ืื•ืŸ ื“ืึทื˜ืึทื‘ื™ื™ืกื™ื–

ื ื•ืœ ื“ืึทื•ื ื˜ื™ื™ื ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ืื•ืŸ ื“ืึทื˜ืึทื‘ื™ื™ืกื™ื–

ื“ืขืจ ืึทืจื˜ื™ืงืœ ื“ืขืจืงืœืขืจื˜ ืื™ืŸ ื“ืขื˜ืึทืœ ื•ื•ื™ ืฆื• ืกืึธืœื•ื•ืข ื“ื™ื™ื˜ืึทื‘ื™ื™ืก ืงืึทืžืคึผืึทื˜ืึทื‘ื™ืœืึทื˜ื™ ื™ืฉื•ื– ืื™ืŸ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜. ืžื™ืจ ื•ื•ืขืœืŸ ื–ืึธื’ืŸ ืื™ืจ ื•ื•ืึธืก ืงืขื ืขืŸ ืคึผืึทืกื™ืจืŸ ืžื™ื˜ ื“ื™ื™ืŸ ืคึผืจืึธื“ื•ืงืฆื™ืข ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื– ืื•ื™ื‘ ืื™ืจ ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ืฆืขื•ื•ื™ืงืœืขืŸ ืึธืŸ ืคึผืจื™ืœื™ืžืึทื ืขืจื™ ืฆื•ื’ืจื™ื™ื˜ื•ื ื’. ืžื™ืจ ื•ื•ืขืœืŸ ื“ืขืจื ืึธืš ื“ื•ืจื›ื’ื™ื™ืŸ ื“ื™ ืกื˜ืึทื’ืขืก ืคื•ืŸ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืœื™ื™ืคืกื™ื™ืงืœ ื•ื•ืึธืก ื–ืขื ืขืŸ ืคืืจืœืื ื’ื˜ ืฆื• ื”ืึธื‘ืŸ ื ื•ืœ ื“ืึทื•ื ื˜ื™ื™ื (ืึทืคึผืคึผืจืึธืงืก. ืฉื˜ืขื’: ื•ื•ื™ื™ึทื˜ืขืจ - ื ื•ืœ ื“ืึทื•ื ื˜ื™ื™ื). ื“ืขืจ ืจืขื–ื•ืœื˜ืึทื˜ ืคื•ืŸ ืื•ื ื“ื–ืขืจ ืึทืคึผืขืจื™ื™ืฉืึทื ื– ื•ื•ืขื˜ ื–ื™ื™ืŸ ืฆื• ืฆื•ืœื™ื™ื’ืŸ ื“ื™ ืงืึทืคึผื•ื™ืขืจ-ื™ื ืงืึทืžืคึผืึทื˜ืึทื‘ืึทืœ ื“ืึทื˜ืึทื‘ื™ื™ืก ื˜ื•ื™ืฉืŸ ืื™ืŸ ืึท ืงืึทืคึผื•ื™ืขืจ-ืงืึทืžืคึผืึทื˜ืึทื‘ืึทืœ ืฉื˜ื™ื™ื’ืขืจ.

ืื•ื™ื‘ ืื™ืจ ื•ื•ื™ืœืŸ ืฆื• ืคึฟืึทืจืฉื˜ื™ื™ืŸ ื“ื™ ืงืึธื“ ื‘ื™ื™ืฉืคื™ืœืŸ ืคื•ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ, ืื™ืจ ืงืขื ืขืŸ ื’ืขืคึฟื™ื ืขืŸ ื–ื™ื™ ื‘ื™ื™ ื’ื™ื˜ื”ื•ื‘.

ื”ืงื“ืžื”

ื ื•ืœ ื“ืึทื•ื ื˜ื™ื™ื ื“ื™ืคึผืœื•ื™ืžืึทื ื˜

ื•ื•ืึธืก ืึท ืžื™ืกื˜ื™ืฉ ื ื•ืœ ื“ืึทื•ื ื˜ื™ื™ื ื“ื™ืคึผืœื•ื™ืžืึทื ื˜? ืื™ืจ ืงืขื ื˜ ื–ืึธื’ืŸ ืึทื– ื“ืึธืก ืื™ื– ื•ื•ืขืŸ ื“ื™ื™ืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืื™ื– ื“ื™ืคึผืœื•ื™ื“ ืื™ืŸ ืึทื–ืึท ืึท ื•ื•ืขื’ ืึทื– ืื™ืจ ืงืขื ืขืŸ ื”ืฆืœื—ื” ื‘ืึทืงืขื ืขืŸ ืึท ื ื™ื™ึทืข ื•ื•ืขืจืกื™ืข ืคื•ืŸ โ€‹โ€‹โ€‹โ€‹ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืฆื• ืคึผืจืึธื“ื•ืงืฆื™ืข, ื‘ืฉืขืช ื“ืขืจ ื‘ืึทื ื™ืฆืขืจ ืงืขืŸ ื ื™ืฉื˜ ื‘ืึทืžืขืจืงืŸ ื“ื™ ืึทื ืึทื•ื•ื™ื™ืœืึทื‘ื™ืœื™ื˜ื™. ืคึฟื•ืŸ ืึท ื‘ืึทื ื™ืฆืขืจ ืื•ืŸ ืคื™ืจืžืข ืคึผืขืจืกืคึผืขืงื˜ื™ื•ื•, ื“ืึธืก ืื™ื– ื“ืขืจ ื‘ืขืกื˜ืขืจ ืžืขื’ืœืขืš ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ืกืฆืขื ืึทืจ ื•ื•ื™ื™ึทืœ ืขืก ืึทืœืึทื•ื– ื ื™ื™ึท ืคึฟืขื™ึดืงื™ื™ื˜ืŸ ืฆื• ื–ื™ื™ืŸ ื‘ืึทืงืขื ืขื  ืื•ืŸ ื‘ืึทื’ื– ืฆื• ื–ื™ื™ืŸ ืคืึทืจืคืขืกื˜ื™ืงื˜ ืึธืŸ ื“ื™ืกืจืึทืคึผืฉืึทืŸ.

ื•ื•ื™ ืฆื• ื“ืขืจื’ืจื™ื™ื›ืŸ ื“ืขื? ืขืก ื–ืขื ืขืŸ ืขื˜ืœืขื›ืข ื•ื•ืขื’ืŸ, ื“ืึธ ืื™ื– ืื™ื™ื ืขืจ ืคื•ืŸ ื–ื™ื™:

  • ืฆืขื•ื•ื™ืงืœืขืŸ ื•ื•ืขืจืกื™ืข ื ื•ืž 1 ืคื•ืŸ ื“ื™ื™ืŸ ื“ื™ื ืกื˜
  • ื“ื•ืจื›ืคื™ืจืŸ ืึท ื“ืึทื˜ืึทื‘ื™ื™ืก ืžื™ื’ืจืึทื˜ื™ืึธืŸ
  • ืฆืขื•ื•ื™ืงืœืขืŸ ื•ื•ืขืจืกื™ืข #2 ืคื•ืŸ ื“ื™ื™ืŸ ืกืขืจื•ื•ื™ืก ืื™ืŸ ืคึผืึทืจืึทืœืขืœ ืžื™ื˜ ื•ื•ืขืจืกื™ืข #1
  • ื•ื•ื™ ื‘ืึทืœื“ ื•ื•ื™ ืื™ืจ ื–ืขืŸ ืึทื– ื•ื•ืขืจืกื™ืข ื ื•ืž 2 ืึทืจื‘ืขื˜ ื•ื•ื™ ืขืก ื–ืึธืœ, ืึทืจืึธืคึผื ืขืžืขืŸ ื•ื•ืขืจืกื™ืข ื ื•ืž 1
  • done!

ื’ืจื™ื ื’, ืื™ื– ื ื™ื˜ ืขืก? ืฆื•ื ื‘ืึทื“ื•ื™ืขืจืŸ, ื“ืึธืก ืื™ื– ื ื™ืฉื˜ ืึทื–ื•ื™ ืคึผืฉื•ื˜, ืื•ืŸ ืžื™ืจ ื•ื•ืขืœืŸ ืงื•ืงืŸ ืื™ืŸ ื“ืขื ืื™ืŸ ื“ืขื˜ืึทืœ ืฉืคึผืขื˜ืขืจ. ืื™ืฆื˜ ืœืึธื–ืŸ ืก ื˜ืฉืขืง ืืŸ ืื ื“ืขืจ ืคืขืจืœื™ ืคึผืจืึธืกื˜ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ืคึผืจืึธืฆืขืก - ื‘ืœื•ื™ ื’ืจื™ืŸ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜.

ื”ืึธื‘ืŸ ืื™ืจ ืืœืฅ ื’ืขื”ืขืจื˜ ืคื•ืŸ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ืคื•ืŸ ื‘ืœื•ื™ ื’ืจื™ืŸ? ืงืœืึธื•ื“ ืคืึทื•ื ื“ืจื™ ืžืื›ื˜ ื“ืึธืก ื’ืึธืจ ื’ืจื™ื ื’. ื ืึธืจ ืงื•ืง ื‘ื™ื™ึท ื“ืขื ืึทืจื˜ื™ืงืœ, ื•ื•ื• ืžื™ืจ ื‘ืึทืฉืจื™ื™ึทื‘ืŸ ื“ืขื ืื™ืŸ ืžืขืจ ื“ืขื˜ืึทืœ. ืฆื• ื‘ืขืงื™ืฆืขืจ ืกืึทืžืขืจื™ื™ื–, ืœืึธื–ืŸ ืื•ื ื“ื– ื“ืขืจืžืึธื ืขืŸ ืื™ืจ ื•ื•ื™ ืฆื• ืžืึทื›ืŸ ื‘ืœื•ื™ ื’ืจื™ืŸ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜:

  • ืขื ืฉื•ืจ ืึทื– ืฆื•ื•ื™ื™ ืขืงื–ืขืžืคืœืืจืŸ ืคื•ืŸ ื“ื™ื™ืŸ ืคึผืจืึธื“ื•ืงืฆื™ืข ืงืึธื“ ("ื‘ืœื•ื™" ืื•ืŸ "ื’ืจื™ืŸ") ืึทืจื‘ืขื˜;
  • ื“ื™ืจืขืงื˜ ืึทืœืข ืคืึทืจืงืขืจ ืฆื• ื“ื™ ื‘ืœื•ื™ ืกื•ื•ื™ื•ื•ืข, ื“.ื”. ืึทื–ื•ื™ ืึทื– ืคึผืจืึธื“ื•ืงืฆื™ืข URL ืก ืคื•ื ื˜ ื“ืึธืจื˜;
  • ืฆืขื•ื•ื™ืงืœืขืŸ ืื•ืŸ ืคึผืจื•ื‘ื™ืจืŸ ืึทืœืข ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืขื ื“ืขืจื•ื ื’ืขืŸ ืื™ืŸ ืึท ื’ืจื™ืŸ ืกื•ื•ื™ื•ื•ืข;
  • ื‘ืึทืฉื˜ื™ืžืขืŸ URL ืคื•ืŸ ื‘ืœื•ื™ ืฆื• ื’ืจื™ืŸ ืกื•ื•ื™ื•ื•ืข

ื‘ืœื•ื™ ื’ืจื™ืŸ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ืื™ื– ืึท ืฆื•ื’ืึทื ื’ ื•ื•ืึธืก ืึทืœืึทื•ื– ืื™ืจ ืฆื• ืœื™ื™ื›ื˜ ื‘ืึทืงืขื ืขืŸ ื ื™ื™ึทืข ืคึฟืขื™ึดืงื™ื™ื˜ืŸ ืึธืŸ ื–ืึธืจื’ ื•ื•ืขื’ืŸ ื‘ืจื™ื™ืงื™ื ื’ ืคึผืจืึธื“ื•ืงืฆื™ืข. ื“ืึธืก ืื™ื– ืจืขื›ื˜ ืฆื• ื“ืขื ืคืึทืงื˜ ืึทื– ืืคื™ืœื• ืื•ื™ื‘ ืขืคึผืขืก ื›ืึทืคึผืึทื ื–, ืื™ืจ ืงืขื ืขืŸ ืœื™ื™ื›ื˜ ืฆื•ืจื™ืงืงื•ืžืขืŸ ืฆื• ื“ื™ ืคืจื™ืขืจื“ื™ืงืข ืกื•ื•ื™ื•ื•ืข ื“ื•ืจืš ืคืฉื•ื˜ "ืคืœื™ื™ืงื™ื ื’ ืึท ื‘ืึทืฉื˜ื™ืžืขืŸ."

ื ืึธืš ืœื™ื™ืขื ืขืŸ ืึทืœืข ื“ื™ ืื•ื™ื‘ืŸ, ืื™ืจ ืงืขืŸ ืคืจืขื’ืŸ ื“ื™ ืงืฉื™ื: ื•ื•ืึธืก ื”ืื˜ ื ื•ืœ ื“ืึทื•ื ื˜ื™ื™ื ืฆื• ื˜ืึธืŸ ืžื™ื˜ ื‘ืœื•ื™ ื’ืจื™ืŸ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜?

ื ื•, ื–ื™ื™ ื”ืึธื‘ืŸ ื’ืึทื ืฅ ืึท ืคึผืœืึทืฅ ืื™ืŸ ืคึผืจืึธืกื˜, ื•ื•ื™ื™ึทืœ ืฆื• ื”ืึทืœื˜ืŸ ืฆื•ื•ื™ื™ ืขืงื–ืขืžืคืœืืจืŸ ืคื•ืŸ ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ืกื•ื•ื™ื•ื•ืข ืจื™ืงื•ื•ื™ื™ืขืจื– ื˜ืึธืคึผืœ ืžื™ ืฆื• ื”ืึทืœื˜ืŸ ื–ื™ื™. ื“ืึธืก ืื™ื– ื•ื•ืึธืก ืขื˜ืœืขื›ืข ื˜ื™ืžื– ืคืึธื“ืขืจืŸ ืžืืจื˜ื™ืŸ ืคืื•ืœืขืจ, ื ืึธื›ื’ื™ื™ืŸ ืึท ื•ื•ืขืจื™ื™ื™ืฉืึทืŸ ืคื•ืŸ ื“ืขื ืฆื•ื’ืึทื ื’:

ืืŸ ืื ื“ืขืจ ืึธืคึผืฆื™ืข ืื™ื– ืฆื• ื ื•ืฆืŸ ื“ื™ ื–ืขืœื‘ืข ื“ืึทื˜ืึทื‘ื™ื™ืก, ืงืจื™ื™ื™ื˜ื™ื ื’ ื‘ืœื•ื™-ื’ืจื™ืŸ ืกื•ื•ื™ื˜ืฉื™ื– ืคึฟืึทืจ ื“ื™ ื•ื•ืขื‘ ืื•ืŸ ืคืขืœื“ ืœื™ื™ึทืขืจืก. ืื™ืŸ ื“ืขื ืฆื•ื’ืึทื ื’, ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก ืงืขืŸ ืึธืคื˜ ื–ื™ื™ืŸ ืึท ืคึผืจืึธื‘ืœืขื, ืกืคึผืขืฆื™ืขืœ ื•ื•ืขืŸ ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื˜ื•ื™ืฉืŸ ื“ื™ ืกื›ืขืžืข ืฆื• ืฉื˜ื™ืฆืŸ ืึท ื ื™ื™ึทืข ื•ื•ืขืจืกื™ืข ืคื•ืŸ โ€‹โ€‹โ€‹โ€‹ื“ื™ ื•ื•ื™ื™ื›ื•ื•ืืจื’.

ืื•ืŸ ื“ืึธ ืžื™ืจ ืงื•ืžืขืŸ ืฆื• ื“ื™ ื”ื•ื™ืคึผื˜ ืคึผืจืึธื‘ืœืขื ืื™ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ. Database. ื–ืืœ ืก ื ืขืžืขืŸ ืืŸ ืื ื“ืขืจ ืงื•ืง ืื™ืŸ ื“ืขื ืคืจืึทื–ืข.

ื“ื•ืจื›ืคื™ืจืŸ ืึท ื“ืึทื˜ืึทื‘ื™ื™ืก ืžื™ื’ืจืึทื˜ื™ืึธืŸ.

ืื™ืฆื˜ ืื™ืจ ื”ืึธื‘ืŸ ืฆื• ืคืจืขื’ืŸ ื–ื™ืš ื“ื™ ืงืฉื™ื - ื•ื•ืึธืก ืื•ื™ื‘ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก ืขื ื“ืขืจื•ื ื’ ืื™ื– ื ื™ืฉื˜ ืงืึทืคึผื•ื™ืขืจ ืงืึทืžืคึผืึทื˜ืึทื‘ืึทืœ? ื•ื•ืขื˜ ื ื™ืฉื˜ ืžื™ื™ืŸ ืขืจืฉื˜ืขืจ ื•ื•ืขืจืกื™ืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ืึทืคึผ ื‘ืจืขื›ืŸ? ืื™ืŸ ืคืึทืงื˜, ื“ืึธืก ืื™ื– ืคึผื•ื ืงื˜ ื•ื•ืึธืก ื•ื•ืขื˜ ืคึผืึทืกื™ืจืŸ ...

ืืคื™ืœื• ื˜ืจืึธืฅ ื“ื™ ืจื™ื–ื™ืง ื‘ืขื ืขืคื™ืฅ ืคื•ืŸ ื ื•ืœ ื“ืึทื•ื ื˜ื™ื™ื / ื‘ืœื•ื™ ื’ืจื™ืŸ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜, ืงืึธืžืคึผืึทื ื™ืขืก ื˜ืขื ื“ ืฆื• ื ืึธื›ืคืึธืœื’ืŸ ื“ื™ ืคืืœื’ืขื ื“ืข ืกืึทืคืขืจ ืคึผืจืึธืฆืขืก ืคึฟืึทืจ ื“ื™ืคึผืœื•ื™ื™ื ื’ ื–ื™ื™ืขืจ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–:

  • ืฆื•ื’ืจื™ื™ื˜ืŸ ืึท ืคึผืขืงืœ ืžื™ื˜ ืึท ื ื™ื™ึทืข ื•ื•ืขืจืกื™ืข ืคื•ืŸ โ€‹โ€‹โ€‹โ€‹ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ
  • ืคืึทืจืžืึทื›ืŸ ืึท ืคืœื™ืกื ื“ื™ืง ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ
  • ืœื•ื™ืคืŸ ืกืงืจื™ืคึผืก ืฆื• ืžื™ื™ื’ืจื™ื™ื˜ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก
  • ืฆืขื•ื•ื™ืงืœืขืŸ ืื•ืŸ ืงืึทื˜ืขืจ ืึท ื ื™ื™ึทืข ื•ื•ืขืจืกื™ืข ืคื•ืŸ โ€‹โ€‹โ€‹โ€‹ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ

ืื™ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ, ืžื™ืจ ื•ื•ืขืœืŸ ื“ืขื˜ืึทืœ ื•ื•ื™ ืื™ืจ ืงืขื ืขืŸ ืึทืจื‘ืขื˜ืŸ ืžื™ื˜ ื“ื™ื™ืŸ ื“ืึทื˜ืึทื‘ื™ื™ืก ืื•ืŸ ืงืึธื“ ืฆื• ื ื•ืฆืŸ ื ื•ืœ ื“ืึทื•ื ื˜ื™ื™ื ื“ื™ืคึผืœื•ื™ืžืึทื ื˜.

ื“ืึทื˜ืึทื‘ืึทืกืข ื™ืฉื•ื–

ืื•ื™ื‘ ืื™ืจ ื”ืึธื‘ืŸ ืึท ืกื˜ื™ื™ื˜ืœืขืกืก ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื•ื•ืึธืก ื˜ื•ื˜ ื ื™ืฉื˜ ืงืจืึธื ืงื™ื™ืŸ ื“ืึทื˜ืŸ ืื™ืŸ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก, ืื™ืจ ืงืขื ืขืŸ ื‘ืึทืงื•ืžืขืŸ ื ื•ืœ ื“ืึทื•ื ื˜ื™ื™ื ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ื’ืœื™ื™ืš. ืฆื•ื ื‘ืึทื“ื•ื™ืขืจืŸ, ืจื•ื‘ึฟ ื•ื•ื™ื™ื›ื•ื•ืืจื’ ื“ืึทืจืฃ ืฆื• ืงืจืึธื ื“ืึทื˜ืŸ ืขืจื’ืขืฅ. ื“ืึธืก ืื™ื– ื•ื•ืึธืก ืื™ืจ ื–ืึธืœ ื˜ืจืึทื›ื˜ืŸ ืฆื•ื•ื™ื™ ืžืึธืœ ืื™ื™ื“ืขืจ ืื™ืจ ืžืึทื›ืŸ ืขื ื“ืขืจื•ื ื’ืขืŸ ืฆื• ื“ื™ ืงืจื™ื™ึทื–. ืื™ื™ื“ืขืจ ืžื™ืจ ื‘ืึทืงื•ืžืขืŸ ืื™ืŸ ื“ื™ ื“ืขื˜ืึทื™ืœืก ืคื•ืŸ ื•ื•ื™ ืฆื• ื˜ื•ื™ืฉืŸ ื“ื™ ืกื˜ืฉืขืžืึท ืึทื–ื•ื™ ืึทื– ืงื™ื™ืŸ ื“ืึทื•ื ื˜ื™ื™ื ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ืื™ื– ืžืขื’ืœืขืš, ืœืึธื–ืŸ ืื•ื ื“ื– ืขืจืฉื˜ืขืจ ืคืึธืงื•ืก ืื•ื™ืฃ ื“ื™ ื•ื•ืขืจืกื™ืข ืกื˜ืฉืขืžืึท.

ื•ื•ืขืจืกื™ืข ืกื›ืขืžืข

ืื™ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ ืžื™ืจ ื•ื•ืขืœืŸ ื ื•ืฆืŸ ืคืœื™ื•ื•ื™ื™ ื•ื•ื™ ืึท ื•ื•ืขืจืกื™ืข ืงืึธื ื˜ืจืึธืœ ื’ืขืฆื™ื™ึทื’ (ืึทืคึผืคึผืจืึธืงืก. ืื™ื‘ืขืจื–ืขืฆื•ื ื’: ืžื™ืจ ื–ืขื ืขืŸ ื’ืขืจืขื“ื˜ ื•ื•ืขื’ืŸ ื“ืึทื˜ืึทื‘ื™ื™ืก ืžื™ื’ืจื™ื™ืฉืึทื ื–). ื’ืขื•ื•ื™ื™ื ื˜ืœืขืš, ืžื™ืจ ื•ื•ืขืœืŸ ืื•ื™ืš ืฉืจื™ื™ึทื‘ืŸ ืึท ืกืคึผืจื™ื ื’ ื‘ืึธืึธื˜ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื•ื•ืึธืก ื”ืื˜ ืึท ื’ืขื‘ื•ื™ื˜-ืื™ืŸ ืคืœื™ื•ื•ื™ื™ึท ืฉื˜ื™ืฆืŸ ืื•ืŸ ื•ื•ืขื˜ ื“ื•ืจื›ืคื™ืจืŸ ืกื˜ืฉืขืžืึท ืžื™ื™ื’ืจื™ื™ืฉืึทืŸ ื‘ืฉืขืช ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืงืึธื ื˜ืขืงืกื˜. ื•ื•ืขืŸ ืื™ืจ ื ื•ืฆืŸ 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, ื˜ืฉืขืง ืื•ื™ืก ืคืจื™ืœื™ื ื’ ืฉื˜ื™ื•ื•ืœ ื“ืึธืงืก.

ื“ื•ืจืš ื ื™ืฆืŸ ืึท ืžืงื•ืจ ืงืึธื ื˜ืจืึธืœ ื’ืขืฆื™ื™ึทื’ ืžื™ื˜ ืกืคึผืจื™ื ื’ ื‘ืึธืึธื˜, ืื™ืจ ื‘ืึทืงื•ืžืขืŸ 2 ื’ืจื•ื™ืก ื‘ืขื ืขืคื™ืฅ:

  • ืื™ืจ ื‘ืึทื–ื•ื ื“ืขืจ ื“ื™ื™ื˜ืึทื‘ื™ื™ืก ืขื ื“ืขืจื•ื ื’ืขืŸ ืคื•ืŸ ืงืึธื“ ืขื ื“ืขืจื•ื ื’ืขืŸ
  • ื“ืึทื˜ืึทื‘ืึทืกืข ืžื™ื’ืจืึทื˜ื™ืึธืŸ ืึทืงืขืจื– ืฆื•ื–ืืžืขืŸ ืžื™ื˜ ื“ื™ ืจืึธื•ืœืึทื•ื˜ ืคื•ืŸ ื“ื™ื™ืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ, ื“"ื”. ื“ื™ื™ืŸ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ืคึผืจืึธืฆืขืก ืื™ื– ืกื™ืžืคึผืœืึทืคื™ื™ื“

ื˜ืจืึธื•ื‘ืœืขืฉืึธืึธื˜ื™ื ื’ ื“ื™ื™ื˜ืึทื‘ื™ื™ืก ืคึผืจืึธื‘ืœืขืžืก

ืื™ืŸ ื“ืขืจ ื•ื•ื™ื™ึทื˜ืขืจ ืึธืคึผื˜ื™ื™ืœื•ื ื’ ืคื•ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ, ืžื™ืจ ื•ื•ืขืœืŸ ืคืึธืงื•ืก ืื•ื™ืฃ ืฆื•ื•ื™ื™ ืึทืคึผืจืึธื•ื˜ืฉื™ื– ืฆื• ื“ืึทื˜ืึทื‘ื™ื™ืก ืขื ื“ืขืจื•ื ื’ืขืŸ.

  • ืฆื•ืจื™ืง ื™ื ืงืึทืžืคึผืึทื˜ืึทื‘ื™ืœืึทื˜ื™
  • ืฆื•ืจื™ืง ืงืึทืžืคึผืึทื˜ืึทื‘ื™ืœืึทื˜ื™

ื“ืขืจ ืขืจืฉื˜ืขืจ ืื™ื™ื ืขืจ ื•ื•ืขื˜ ื–ื™ื™ืŸ ื’ืขืจืขื›ื ื˜ ื•ื•ื™ ืึท ื•ื•ืืจืขื ื•ื ื’ ืึทื– ืื™ืจ ื–ืึธืœ ื ื™ืฉื˜ ื“ื•ืจื›ืคื™ืจืŸ ื ื•ืœ ื“ืึทื•ื ื˜ื™ื™ื ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ืึธืŸ ืคึผืจื™ืœื™ืžืึทื ืขืจื™ ืฆื•ื’ืจื™ื™ื˜ื•ื ื’ ... ื“ื™ ืฆื•ื•ื™ื™ื˜ืข ืึธืคืคืขืจืก ืึท ืœื™ื™ื–ื•ื ื’ ื•ื•ื™ ืื™ืจ ืงืขื ืขืŸ ื“ื•ืจื›ืคื™ืจืŸ ืึท ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ืึธืŸ ื“ืึทื•ื ื˜ื™ื™ื ืื•ืŸ ืื™ืŸ ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ืฆื™ื™ื˜ ื”ืึทืœื˜ืŸ ืฆื•ืจื™ืง ืงืึทืžืคึผืึทื˜ืึทื‘ื™ืœืึทื˜ื™.

ืื•ื ื“ื–ืขืจ ืคึผืจื•ื™ืขืงื˜ ื•ื•ืึธืก ืžื™ืจ ื•ื•ืขืœืŸ ืึทืจื‘ืขื˜ืŸ ืื•ื™ืฃ ื•ื•ืขื˜ ื–ื™ื™ืŸ ืึท ืคึผืฉื•ื˜ Spring Boot Flyway ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ Person ั first_name ะธ last_name ืื™ืŸ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก (ืึทืคึผืคึผืจืึธืงืก. ืื™ื‘ืขืจื–ืขืฆื•ื ื’: Person ืื™ื– ื ื˜ื™ืฉ ืื•ืŸ ืคirst_name ะธ last_name โ€• ื“ืึธืก ื–ืฒึทื ืขืŸ ื“ื™ ืคึฟืขืœื“ืขืจ ืื™ืŸ ืื™ื). ืžื™ืจ ื•ื•ื™ืœืŸ ืฆื• ืจืขื ืึทืžืข last_name ะฒ surname.

ืึทืกืึทืžืคึผืฉืึทื ื–

ืื™ื™ื“ืขืจ ืžื™ืจ ื‘ืึทืงื•ืžืขืŸ ืื™ืŸ ื“ื™ ื“ืขื˜ืึทื™ืœืก, ืขืก ื–ืขื ืขืŸ ืึท ืคึผืึธืจ ืคื•ืŸ ืึทืกืึทืžืคึผืฉืึทื ื– ื•ื•ืึธืก ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืžืึทื›ืŸ ื•ื•ืขื’ืŸ ืื•ื ื“ื–ืขืจ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–. ื“ืขืจ ื”ื•ื™ืคึผื˜ ืจืขื–ื•ืœื˜ืึทื˜ ื•ื•ืึธืก ืžื™ืจ ื•ื•ื™ืœืŸ ืฆื• ื“ืขืจื’ืจื™ื™ื›ืŸ ื•ื•ืขื˜ ื–ื™ื™ืŸ ืึท ื’ืึทื ืฅ ืคึผืฉื•ื˜ ืคึผืจืึธืฆืขืก.

ื“ื™ ื˜ืึธืŸ. ื’ืขืฉืขืคื˜ ืคึผืจืึธ-ื˜ื™ืคึผ. ืกื™ืžืคึผืœื™ืคื™ื™ื ื’ ืคึผืจืึทืกืขืกืึทื– ืงืขื ืขืŸ ืจืึทื˜ืขื•ื•ืขืŸ ืื™ืจ ืึท ืคึผืœืึทืฅ ืคื•ืŸ ื’ืขืœื˜ ืื•ื™ืฃ ืฉื˜ื™ืฆืŸ (ื“ื™ ืžืขืจ ืžืขื ื˜ืฉืŸ ืื™ืจ ื”ืึธื‘ืŸ ืืจื‘ืขื˜ืŸ ืคึฟืึทืจ ื“ื™ื™ืŸ ืคื™ืจืžืข, ื“ื™ ืžืขืจ ื’ืขืœื˜ ืื™ืจ ืงืขื ืขืŸ ืฉืคึผืึธืจืŸ)!

ื ื™ื˜ ื“ืึทืจืคึฟืŸ ืฆื• ืฆื•ืจื™ืงืงืจื™ื’ืŸ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก

ื“ืขื ืกื™ืžืคึผืœืึทืคื™ื™ื– ื“ื™ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ืคึผืจืึธืฆืขืก (ืขื˜ืœืขื›ืข ื“ืึทื˜ืึทื‘ื™ื™ืก ืจืึธื•ืœื‘ืึทืงืงืก ื–ืขื ืขืŸ ื›ึผืžืขื˜ ืื•ืžืžืขื’ืœืขืš, ืึทื–ืึท ื•ื•ื™ ื“ื™ืœื™ืฉืึทืŸ ืจืึธื•ืœื‘ืึทืง). ืžื™ืจ ื‘ืขืกืขืจ ื•ื•ืขืœืŸ ืฆื• ืฆื•ืจื™ืงืงืจื™ื’ืŸ ื‘ืœื•ื™ื– ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–. ื“ืขื ื•ื•ืขื’, ืืคื™ืœื• ืื•ื™ื‘ ืื™ืจ ื”ืึธื‘ืŸ ืคืึทืจืฉื™ื“ืขื ืข ื“ืึทื˜ืึทื‘ื™ื™ืกื™ื– (ืœืžืฉืœ, SQL ืื•ืŸ NoSQL), ื“ื™ื™ืŸ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ืจืขืจื  - ืœื™ื ื™ืข ื•ื•ืขื˜ ืงื•ืงืŸ ื“ื™ ื–ืขืœื‘ืข.

ืขืก ืžื•ื–ืŸ ืฉื˜ืขื ื“ื™ืง ื–ื™ื™ืŸ ืžืขื’ืœืขืš ืฆื• ืฆื•ืจื™ืงืงืจื™ื’ืŸ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืื™ื™ืŸ ื•ื•ืขืจืกื™ืข ืฆื•ืจื™ืง (ื ื™ื˜ ืžืขืจ)

ืจืึธื•ืœื‘ืึทืง ื–ืึธืœ ื–ื™ื™ืŸ ื’ืขื˜ืืŸ ื‘ืœื•ื™ื– ื•ื•ืขืŸ ื ื™ื™ื˜ื™ืง. ืื•ื™ื‘ ืขืก ืื™ื– ืึท ื–ืฉื•ืง ืื™ืŸ ื“ื™ ืงืจืึทื ื˜ ื•ื•ืขืจืกื™ืข ื•ื•ืึธืก ืื™ื– ื ื™ืฉื˜ ืœื™ื™ื›ื˜ ืคืึทืจืคืขืกื˜ื™ืงื˜, ืžื™ืจ ื–ืึธืœ ืงืขื ืขืŸ ืฆื• ืฆื•ืจื™ืงืงื•ืžืขืŸ ืฆื• ื“ื™ ืœืขืฆื˜ืข ืืจื‘ืขื˜ืŸ ื•ื•ืขืจืกื™ืข. ืžื™ืจ ื™ื‘ืขืจื ืขืžืขืŸ ืึทื– ื“ื™ ืœืขืฆื˜ืข ืึทืจื‘ืขื˜ ื•ื•ืขืจืกื™ืข ืื™ื– ื“ื™ ืคืจื™ืขืจื“ื™ืงืข. ืึธื ื”ืึทืœื˜ืŸ ืงืึธื“ ืื•ืŸ ื“ืึทื˜ืึทื‘ื™ื™ืก ืงืึทืžืคึผืึทื˜ืึทื‘ื™ืœืึทื˜ื™ ืคึฟืึทืจ ืžืขืจ ื•ื•ื™ ืื™ื™ืŸ ืจืึธื•ืœืึทื•ื˜ ื•ื•ืึธืœื˜ ื–ื™ื™ืŸ ื’ืึธืจ ืฉื•ื•ืขืจ ืื•ืŸ ื˜ื™ื™ึทืขืจ.

ื“ื™ ืฆืขื˜ืœ. ืื™ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ ืžื™ืจ ื•ื•ืขืœืŸ ื˜ื•ื™ืฉืŸ ื“ื™ ื”ื•ื™ืคึผื˜ ื•ื•ืขืจืกื™ืข ืคื•ืŸ โ€‹โ€‹โ€‹โ€‹ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืคึฟืึทืจ ืžืขืจ ืœื™ื™ืขื ืขืŸ.

ืฉืจื™ื˜ 1: ืขืจืฉื˜ ืฉื˜ืึทื˜

ืึทืคึผ ื•ื•ืขืจืกื™ืข: 1.0.0
DB ื•ื•ืขืจืกื™ืข: v1

ื‘ืึทืžืขืจืงื•ื ื’

ื“ืึธืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ื“ืขืจ ืขืจืฉื˜ ืฉื˜ืึทื˜ ืคื•ืŸ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ.

ื“ืึทื˜ืึทื‘ืึทืกืข ืขื ื“ืขืจื•ื ื’ืขืŸ

DB ื›ึผื•ืœืœ last_name.

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

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

ืงืึธื“ ืขื ื“ืขืจื•ื ื’ืขืŸ

ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืกื˜ืึธืจื– ืžืขื ื˜ืฉ ื“ืึทื˜ืŸ ืื™ืŸ last_name:

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

package sample.flyway;

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

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

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

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

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

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

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

ืฆื•ืจื™ืง ื™ื ืงืึทืžืคึผืึทื˜ืึทื‘ืึทืœ ื–ื™ื™ึทืœ ืจื™ื ื™ื™ืžื™ื ื’

ืœืึธืžื™ืจ ืงื•ืงืŸ ืื™ืŸ ืึท ื‘ื™ื™ึทืฉืคึผื™ืœ ืคื•ืŸ ื•ื•ื™ ืฆื• ื˜ื•ื™ืฉืŸ ืึท ื–ื™ื™ึทืœ ื ืึธืžืขืŸ:

ืื›ื˜ื•ื ื’. ื“ื™ ืคืืœื’ืขื ื“ืข ื‘ื™ื™ึทืฉืคึผื™ืœ ื•ื•ืขื˜ ื‘ืขืงื™ื•ื•ืŸ ื‘ืจืขื›ืŸ ื–ืื›ืŸ. ืžื™ืจ ื•ื•ื™ื™ึทื–ืŸ ื“ืขื ืฆื• ื‘ืึทื•ื•ื™ื™ึทื–ืŸ ื“ื™ ืคึผืจืึธื‘ืœืขื ืคื•ืŸ ื“ืึทื˜ืึทื‘ื™ื™ืก ืงืึทืžืคึผืึทื˜ืึทื‘ื™ืœืึทื˜ื™.

ืึทืคึผ ื•ื•ืขืจืกื™ืข: 2.0.0.BAD

DB ื•ื•ืขืจืกื™ืข: v2bad

ื‘ืึทืžืขืจืงื•ื ื’

ื“ื™ ืงืจืึทื ื˜ ืขื ื“ืขืจื•ื ื’ืขืŸ ืœืึธื–ืŸ ืื•ื ื“ื– ื ื™ืฉื˜ ืœื•ื™ืคืŸ ืฆื•ื•ื™ื™ ื™ื ืกื˜ืึทื ืกื™ื– (ืึทืœื˜ ืื•ืŸ ื ื™ื™ึท) ืื™ืŸ ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ืฆื™ื™ื˜. ืื–ื•ื™, ื ื•ืœ ื“ืึทื•ื ื˜ื™ื™ื ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ื•ื•ืขื˜ ื–ื™ื™ืŸ ืฉื•ื•ืขืจ ืฆื• ื“ืขืจื’ืจื™ื™ื›ืŸ (ืื•ื™ื‘ ืึทืกืึทืžืคึผืฉืึทื ื– ื–ืขื ืขืŸ ื’ืขื ื•ืžืขืŸ ืื™ืŸ ื—ืฉื‘ื•ืŸ, ืขืก ืื™ื– ืคืืงื˜ื™ืฉ ืื•ืžืžืขื’ืœืขืš).

ื / ื‘ ื˜ืขืกื˜ื™ื ื’

ื“ื™ ืื™ืฆื˜ื™ืงืข ืกื™ื˜ื•ืึทืฆื™ืข ืื™ื– ืึทื– ืžื™ืจ ื”ืึธื‘ืŸ ืึท ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื•ื•ืขืจืกื™ืข 1.0.0, ื“ื™ืคึผืœื•ื™ื“ ืื™ืŸ ืคึผืจืึธื“ื•ืงืฆื™ืข, ืื•ืŸ ื“ืึทื˜ืึทื‘ื™ื™ืก v1. ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืฆืขื•ื•ื™ืงืœืขืŸ ืึท ืฆื•ื•ื™ื™ื˜ ื‘ื™ื™ึทืฉืคึผื™ืœ ืคื•ืŸ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ, ื•ื•ืขืจืกื™ืข 2.0.0.BAD, ืื•ืŸ ื“ืขืจื”ื™ื™ึทื ื˜ื™ืงืŸ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก ืฆื• v2bad.

ืกื˜ืขืคึผืก:

  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 ื•ื•ืขื˜ ืึทืจื‘ืขื˜ืŸ ืึธืŸ ืคืจืื‘ืœืขืžืขืŸ

ื•ื•ื™ ืื™ืจ ืงืขื ืขืŸ ื–ืขืŸ, ืื•ื™ื‘ ืžื™ืจ ืžืึทื›ืŸ ืงืึทืคึผื•ื™ืขืจ ื™ื ืงืึทืžืคึผืึทื˜ืึทื‘ืึทืœ ืขื ื“ืขืจื•ื ื’ืขืŸ ืฆื• ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก ืื•ืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ, ืึท / ื‘ ื˜ืขืกื˜ื™ื ื’ ืื™ื– ืื•ืžืžืขื’ืœืขืš.

ืึทืคึผืคึผืœื™ืงืึทื˜ื™ืึธืŸ ืจืึธื•ืœื‘ืึทืง

ืœืึธืžื™ืจ ื™ื‘ืขืจื ืขืžืขืŸ ืึทื– ื ืึธืš ื˜ืจื™ื™ื ื’ ืฆื• ื˜ืึธืŸ ืึท / ื‘ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ (ืึทืคึผืคึผืจืึธืงืก. ืคึผืขืจ.: ื“ืขืจ ืžื—ื‘ืจ ืžื™ืกื˜ืึธืžืข ืžืขื ื˜ ืึท / ื‘ ื˜ืขืกื˜ื™ื ื’ ื“ืึธ) ืžื™ืจ ื‘ืึทืฉืœืึธืกืŸ ืึทื– ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืฆื•ืจื™ืงืงืจื™ื’ืŸ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืฆื• ื“ื™ ื•ื•ืขืจืกื™ืข 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

ืžืงื•ืจ ืคืœื™ื•ื•ื™ื™ึท ืฉืจื™ืคื˜:

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

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

ืฉืจื™ืคื˜ ื•ื•ืึธืก ืจื™ื ื™ื™ืžื– last_name.

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

ืงืึธื“ ืขื ื“ืขืจื•ื ื’ืขืŸ

ืžื™ืจ ื”ืึธื‘ืŸ ื’ืขื‘ื™ื˜ืŸ ื“ืขื ืคืขืœื“ ื ืึธืžืขืŸ lastName ืื•ื™ืฃ surname.

ืจื™ื ื™ื™ืžื™ื ื’ ืึท ื–ื™ื™ึทืœ ืื™ืŸ ืึท ืงืึทืคึผื•ื™ืขืจ-ืงืึทืžืคึผืึทื˜ืึทื‘ืึทืœ ื•ื•ืขื’

ื“ืึธืก ืื™ื– ื“ื™ ืžืขืจืกื˜ ืคึผืจืึธืกื˜ ืกื™ื˜ื•ืึทืฆื™ืข ืžื™ืจ ืงืขืŸ ื˜ืจืขืคืŸ. ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืžืึทื›ืŸ ืงืึทืคึผื•ื™ืขืจ ื™ื ืงืึทืžืคึผืึทื˜ืึทื‘ืึทืœ ืขื ื“ืขืจื•ื ื’ืขืŸ. ืžื™ืจ ื”ืึธื‘ืŸ ืฉื•ื™ืŸ ืคึผืจืึธื•ื•ืขืŸ ืึทื– ืคึฟืึทืจ ื ื•ืœ ื“ืึทื•ื ื˜ื™ื™ื ื“ื™ืคึผืœื•ื™ืžืึทื ื˜, ืžื™ืจ ื–ืึธืœ ื ื™ืฉื˜ ืคืฉื•ื˜ ืฆื•ืœื™ื™ื’ืŸ ื“ื™ื™ื˜ืึทื‘ื™ื™ืก ืžื™ื’ืจืึทื˜ื™ืึธืŸ ืึธืŸ ื ืึธืš ืกื˜ืขืคึผืก. ืื™ืŸ ื“ืขื ืึธืคึผื˜ื™ื™ืœื•ื ื’ ืคื•ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ, ืžื™ืจ ื•ื•ืขืœืŸ ื“ื•ืจื›ืคื™ืจืŸ 3 ื“ื™ืคึผืœื•ื™ืžืึทื ืฅ ืคื•ืŸ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืฆื•ื–ืืžืขืŸ ืžื™ื˜ ื“ื™ื™ื˜ืึทื‘ื™ื™ืก ืžื™ื™ื’ืจื™ื™ืฉืึทื ื– ืฆื• ื“ืขืจื’ืจื™ื™ื›ืŸ ื“ื™ ื’ืขื•ื•ืืœื˜ ืจืขื–ื•ืœื˜ืึทื˜ ืื•ืŸ ื”ืึทืœื˜ืŸ ืฆื•ืจื™ืง ืงืึทืžืคึผืึทื˜ืึทื‘ื™ืœืึทื˜ื™.

ื“ื™ ื˜ืึธืŸ. ืฆื•ืจื™ืงืจื•ืคืŸ ืึทื– ืžื™ืจ ื”ืึธื‘ืŸ ืึท ื•ื•ืขืจืกื™ืข ื“ืึทื˜ืึทื‘ื™ื™ืก v1. ืขืก ื›ึผื•ืœืœ ืฉืคืืœื˜ืŸ first_name ะธ last_name. ืžื™ืจ ื”ืึธื‘ืŸ ืฆื• ื˜ื•ื™ืฉืŸ last_name ืื•ื™ืฃ surname. ืžื™ืจ ืื•ื™ืš ื”ืึธื‘ืŸ ืึทืคึผ ื•ื•ืขืจืกื™ืข 1.0.0, ื•ื•ืึธืก ืื™ื– ื ืึธืš ื ื™ืฉื˜ ื’ืขื ื™ืฆื˜ surname.

ืฉืจื™ื˜ 2: ืœื™ื™ื’ ืคืึทืžื™ืœื™ืข

ืึทืคึผ ื•ื•ืขืจืกื™ืข: 2.0.0
DB ื•ื•ืขืจืกื™ืข: v2

ื‘ืึทืžืขืจืงื•ื ื’

ื“ื•ืจืš ืึทื“ื™ื ื’ ืึท ื ื™ื™ึท ื–ื™ื™ึทืœ ืื•ืŸ ืงืึทืคึผื™ื™ื ื’ ื–ื™ื™ึทืŸ ืื™ื ื”ืึทืœื˜, ืžื™ืจ ืžืึทื›ืŸ ืงืึทืคึผื•ื™ืขืจ ืงืึทืžืคึผืึทื˜ืึทื‘ืึทืœ ื“ืึทื˜ืึทื‘ื™ื™ืก ืขื ื“ืขืจื•ื ื’ืขืŸ. ืื™ืŸ ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ืฆื™ื™ื˜, ืื•ื™ื‘ ืžื™ืจ ืจืึธื•ืœื™ื ื’ ื“ื™ JAR ืึธื“ืขืจ ื”ืึธื‘ืŸ ืึทืŸ ืึทืœื˜ JAR ืคืœื™ืกื ื“ื™ืง, ืขืก ื•ื•ืขื˜ ื ื™ืฉื˜ ื‘ืจืขื›ืŸ ื‘ืขืฉืึทืก ื“ื•ืจื›ืคื™ืจื•ื ื’.

ืžื™ืจ ืจืึธื•ืœื™ื ื’ ืึท ื ื™ื™ึทืข ื•ื•ืขืจืกื™ืข

ืกื˜ืขืคึผืก:

  1. ื“ื•ืจื›ืคื™ืจืŸ ืึท ื“ืึทื˜ืึทื‘ื™ื™ืก ืžื™ื’ืจืึทื˜ื™ืึธืŸ ืฆื• ืฉืึทืคึฟืŸ ืึท ื ื™ื™ึทืข ื–ื™ื™ึทืœ surname. ืื™ืฆื˜ ื“ื™ื™ืŸ ื“ื‘ ื•ื•ืขืจืกื™ืข 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 ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–. ืื•ื™ื‘ ืื™ืจ ืœื•ื™ืคืŸ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก ื•ื•ืขืจืกื™ืข ืžืึทื ื™ื•ืึทืœื™, ืื™ืจ ื•ื•ืขื˜ ื”ืึธื‘ืŸ ืฆื• ื˜ืึธืŸ ืฆื•ื•ื™ื™ ืคืึทืจืฉื™ื“ืขื ืข ื˜ื™ื ื’ื– (ืขืจืฉื˜ืขืจ ื“ืขืจื”ื™ื™ึทื ื˜ื™ืงืŸ ื“ื™ ื“ื‘ ื•ื•ืขืจืกื™ืข ืžืึทื ื™ื•ืึทืœื™ ืื•ืŸ ื“ืขืžืึธืœื˜ ืฆืขื•ื•ื™ืงืœืขืŸ ื“ื™ ื ื™ื™ึทืข ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ).

ืขืก ืื™ื– ื•ื•ื™ื›ื˜ื™ืง. ื’ืขื“ืขื ืง ืึทื– ื“ื™ ื ื™ื™ ื‘ืืฉืืคืŸ ื–ื™ื™ึทืœ ื–ืืœ ื ื™ืฉื˜ ื–ื™ื™ึทืŸ ื ื™ืฉื˜ ื ื•ืœ. ืื•ื™ื‘ ืื™ืจ ื˜ืึธืŸ ืึท ืจืึธื•ืœื‘ืึทืง, ื“ื™ ืึทืœื˜ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืงืขืŸ ื ื™ืฉื˜ ื•ื•ื™ืกืŸ ื•ื•ืขื’ืŸ ื“ื™ ื ื™ื™ึทืข ื–ื™ื™ึทืœ ืื•ืŸ ื•ื•ืขื˜ ื ื™ืฉื˜ ื™ื ืกื˜ืึทืœื™ืจืŸ ืขืก ื‘ืขืฉืึทืก Insert. ืึธื‘ืขืจ ืื•ื™ื‘ ืื™ืจ ืœื™ื™ื’ืŸ ื“ืขื ืงืึทื ืกื˜ืจื™ื™ื ืฅ ืื•ืŸ ื“ื™ื™ืŸ ื“ื‘ ื•ื•ืขื˜ ื–ื™ื™ืŸ v2, ื“ืึธืก ื•ื•ืขื˜ ื“ืึทืจืคืŸ ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ื“ื™ ื•ื•ืขืจื˜ ืคื•ืŸ ื“ื™ ื ื™ื™ึทืข ื–ื™ื™ึทืœ. ื•ื•ืึธืก ื•ื•ืขื˜ ืคื™ืจืŸ ืฆื• ื•ื•ื™ื™ืึทืœื™ื™ืฉืึทื ื– ืคื•ืŸ ืจื™ืกื˜ืจื™ืงืฉืึทื ื–.

ืขืก ืื™ื– ื•ื•ื™ื›ื˜ื™ืง. ืื™ืจ ื–ืึธืœ ืึทืจืึธืคึผื ืขืžืขืŸ ื“ืขื ืื•ืคึฟืŸ getLastName(), ื•ื•ื™ื™ึทืœ ืื™ืŸ ื“ื™ ื•ื•ืขืจืกื™ืข 3.0.0 ืขืก ืื™ื– ืงื™ื™ืŸ ื‘ืึทื’ืจื™ืฃ ืคื•ืŸ ืึท ื–ื™ื™ึทืœ ืื™ืŸ ื“ื™ ืงืึธื“ last_name. ื“ืขื ืžื™ื˜ืœ ืึทื– ื ืึทืœ ื•ื•ืขื˜ ื–ื™ื™ืŸ ื‘ืึทืฉื˜ื™ืžื˜ ื“ืึธืจื˜. ืื™ืจ ืงืขื ืขืŸ ืœืึธื–ืŸ ื“ืขื ืื•ืคึฟืŸ ืื•ืŸ ืœื™ื™ื’ืŸ ื˜ืฉืขืงืก ืคึฟืึทืจ null, ืึธื‘ืขืจ ืึท ืคื™ืœ ื‘ืขืกืขืจ ืœื™ื™ื–ื•ื ื’ ื•ื•ืึธืœื˜ ื–ื™ื™ืŸ ืฆื• ืžืึทื›ืŸ ื–ื™ื›ืขืจ ืึทื– ืื™ืŸ ื“ื™ ืœืึธื’ื™ืง getSurname() ืื™ืจ ื”ืึธื˜ ืื•ื™ืกื’ืขืงืœื™ื‘ืŸ ื“ื™ ืจื™ื›ื˜ื™ืง ื ื™ื˜-ื ื•ืœ ื•ื•ืขืจื˜.

ื / ื‘ ื˜ืขืกื˜ื™ื ื’

ื“ื™ ืื™ืฆื˜ื™ืงืข ืกื™ื˜ื•ืึทืฆื™ืข ืื™ื– ืึทื– ืžื™ืจ ื”ืึธื‘ืŸ ืึท ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื•ื•ืขืจืกื™ืข 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.

ืคืœื™ื•ื•ื™ื™ึท ืžืงื•ืจ ืฉืจื™ืคื˜:

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

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

ืœื™ื™ื’ ืฉืจื™ืคื˜ surname.

ืื›ื˜ื•ื ื’. ื’ืขื“ืขื ืงื˜ ืึทื– ืื™ืจ ืงืขื ืขืŸ ื ื™ืฉื˜ ืœื™ื™ื’ืŸ ืงื™ื™ืŸ ื ื™ื˜-ื ื•ืœ ืงืึทื ืกื˜ืจื™ื™ื ืฅ ืฆื• ื“ื™ ื–ื™ื™ึทืœ ืื™ืจ ืœื™ื™ื’ืŸ. ืื•ื™ื‘ ืื™ืจ ืจืึธื•ืœื™ื ื’ ื“ื™ JAR, ื“ื™ ืึทืœื˜ ื•ื•ืขืจืกื™ืข ื•ื•ืขื˜ ื ื™ืฉื˜ ื”ืึธื‘ืŸ ืงื™ื™ืŸ ื’ืขื“ืึทื ืง ื•ื•ืขื’ืŸ ื“ื™ ืฆื•ื’ืขืœื™ื™ื’ื˜ ื–ื™ื™ึทืœ ืื•ืŸ ื•ื•ืขื˜ ืื•ื™ื˜ืึธืžืึทื˜ื™ืฉ ืฉื˜ืขืœืŸ ืขืก ืฆื• NULL. ืื•ื™ื‘ ืขืก ืื™ื– ืึทื–ืึท ืึท ื‘ืึทื’ืจืขื ืขืฆื•ื ื’, ื“ื™ ืึทืœื˜ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื•ื•ืขื˜ ืคืฉื•ื˜ ื‘ืจืขื›ืŸ.

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

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

ืงืึธื“ ืขื ื“ืขืจื•ื ื’ืขืŸ

ืžื™ืจ ืงืจืึธื ื“ืึทื˜ืŸ ื•ื•ื™ last_name, ืื•ืŸ ืื™ืŸ surname. ืื™ืŸ ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ืฆื™ื™ึทื˜ ืžื™ืจ ืœื™ื™ืขื ืขืŸ ืคื•ืŸ last_name, ื–ื™ื ื˜ ื“ื™ ื–ื™ื™ึทืœ ืื™ื– ื“ื™ ืžืขืจืกื˜ ื‘ืึทื˜ื™ื™ึทื˜ื™ืง. ื‘ืขืฉืึทืก ื“ื™ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ืคึผืจืึธืฆืขืก, ืขื˜ืœืขื›ืข ืจื™ืงื•ื•ืขืก ืงืขืŸ ื–ื™ื™ืŸ ืคึผืจืึทืกืขืกื˜ ื“ื•ืจืš ืึท ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื‘ื™ื™ึทืฉืคึผื™ืœ ื•ื•ืึธืก ืื™ื– ื ืึธืš ื ื™ืฉื˜ ื“ืขืจื”ื™ื™ึทื ื˜ื™ืงื˜.

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

package sample.flyway;

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

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

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

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

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

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

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

ืฉืจื™ื˜ 3: ืจื™ืžื•ื•ื•ื™ื ื’ last_name ืคื•ืŸ ื“ื™ ืงืึธื“

ืึทืคึผ ื•ื•ืขืจืกื™ืข: 3.0.0

DB ื•ื•ืขืจืกื™ืข:v3

ื‘ืึทืžืขืจืงื•ื ื’

ื ืื˜ื™ืฅ ืคึผืขืจ.: ืžืฉืžืขื•ืช, ืื™ืŸ ื“ืขืจ ืึธืจื™ื’ื™ื ืขืœ ืึทืจื˜ื™ืงืœ ื“ืขืจ ืžื—ื‘ืจ ืžื™ืกื˜ื™ื™ืงืึทื ืœื™ ืงืึทืคึผื™ื“ ื“ืขื ื˜ืขืงืกื˜ ืคื•ืŸ ื“ืขื ื‘ืœืึธืง ืคื•ืŸ ืฉืจื™ื˜ 2. ืื™ืŸ ื“ืขื ืฉืจื™ื˜, ืขื ื“ืขืจื•ื ื’ืขืŸ ื–ืึธืœ ื–ื™ื™ืŸ ื’ืขืžืื›ื˜ ืื™ืŸ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืงืึธื“ ืึทื™ืžืขื“ ืฆื• ืจื™ืžื•ื•ื•ื™ื ื’ ื“ื™ ืคืึทื ื’ืงืฉืึทื ืึทืœื™ื˜ื™ ื•ื•ืึธืก ื ื™ืฆื˜ ื“ื™ ื–ื™ื™ึทืœ last_name.

ื“ื•ืจืš ืึทื“ื™ื ื’ ืึท ื ื™ื™ึทืข ื–ื™ื™ึทืœ ืื•ืŸ ืงืึทืคึผื™ื™ื ื’ ื–ื™ื™ึทืŸ ืื™ื ื”ืึทืœื˜, ืžื™ืจ ื‘ืืฉืืคืŸ ืงืึทืคึผื•ื™ืขืจ ืงืึทืžืคึผืึทื˜ืึทื‘ืึทืœ ื“ืึทื˜ืึทื‘ื™ื™ืก ืขื ื“ืขืจื•ื ื’ืขืŸ. ืื•ื™ืš, ืื•ื™ื‘ ืžื™ืจ ืจืึธื•ืœื™ื ื’ ื“ื™ JAR ืึธื“ืขืจ ื”ืึธื‘ืŸ ืึทืŸ ืึทืœื˜ JAR ืคืœื™ืกื ื“ื™ืง, ืขืก ื•ื•ืขื˜ ื ื™ืฉื˜ ื‘ืจืขื›ืŸ ื‘ืขืฉืึทืก ื“ื•ืจื›ืคื™ืจื•ื ื’.

ืึทืคึผืคึผืœื™ืงืึทื˜ื™ืึธืŸ ืจืึธื•ืœื‘ืึทืง

ื“ืขืจื•ื•ื™ื™ึทืœ ืžื™ืจ ื”ืึธื‘ืŸ ืึทืคึผ ื•ื•ืขืจืกื™ืข 3.0.0 ืื•ืŸ ื“ื™ื™ื˜ืึทื‘ื™ื™ืก v3. ื•ื•ืขืจืกื™ืข 3.0.0 ื˜ื•ื˜ ื ื™ืฉื˜ ืจืึทื˜ืขื•ื•ืขืŸ ื“ืึทื˜ืŸ ืฆื• last_name. ื“ืึธืก ืžื™ื™ื ื˜ ืึทื– ืื™ืŸ surname ื“ื™ ืžืขืจืกื˜ ื•ืคึผื“ืึทื˜ืขื“ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืื™ื– ืกื˜ืึธืจื“.

ืกื˜ืขืคึผืก:

  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: ืจื™ืžื•ื•ื•ื™ื ื’ last_name ืคึฟื•ืŸ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก

ืึทืคึผ ื•ื•ืขืจืกื™ืข: 4.0.0

DB ื•ื•ืขืจืกื™ืข: v4

ื‘ืึทืžืขืจืงื•ื ื’

ืจืขื›ื˜ ืฆื• ื“ืขื ืคืึทืงื˜ ืึทื– ื“ื™ ื•ื•ืขืจืกื™ืข ืงืึธื“ 3.0.0 ื”ืื˜ ื ื™ืฉื˜ ื’ืขื ื•ืฆื˜ ื“ืขื ืงืืœื•ื last_name, ื’ืึธืจื ื™ืฉื˜ ืฉืœืขื›ื˜ ื•ื•ืขื˜ ืคึผืึทืกื™ืจืŸ ื‘ืขืฉืึทืก ื“ื•ืจื›ืคื™ืจื•ื ื’ ืื•ื™ื‘ ืžื™ืจ ื–ืขืžืœ ืฆื•ืจื™ืง ืฆื• 3.0.0 ื ืึธืš ืจื™ืžื•ื•ื•ื™ื ื’ ืึท ื–ื™ื™ึทืœ ืคื•ืŸ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก.

ืฉืจื™ืคื˜ ื“ื•ืจื›ืคื™ืจื•ื ื’ ืœืึธื’ืก

We will do it in the following way:

01) Run 1.0.0
02) Wait for the app (1.0.0) to boot
03) Generate a person by calling POST localhost:9991/person to version 1.0.0
04) Run 2.0.0
05) Wait for the app (2.0.0) to boot
06) Generate a person by calling POST localhost:9991/person to version 1.0.0
07) Generate a person by calling POST localhost:9992/person to version 2.0.0
08) Kill app (1.0.0)
09) Run 3.0.0
10) Wait for the app (3.0.0) to boot
11) Generate a person by calling POST localhost:9992/person to version 2.0.0
12) Generate a person by calling POST localhost:9993/person to version 3.0.0
13) Kill app (3.0.0)
14) Run 4.0.0
15) Wait for the app (4.0.0) to boot
16) Generate a person by calling POST localhost:9993/person to version 3.0.0
17) Generate a person by calling POST localhost:9994/person to version 4.0.0

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

{"firstName":"52b6e125-4a5c-429b-a47a-ef18bbc639d2","lastName":"52b6e125-4a5c-429b-a47a-ef18bbc639d2"}

Starting app in version 2.0.0

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

{"firstName":"e41ee756-4fa7-4737-b832-e28827a00deb","lastName":"e41ee756-4fa7-4737-b832-e28827a00deb"}

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

{"firstName":"0c1240f5-649a-4bc5-8aa9-cff855f3927f","lastName":"0c1240f5-649a-4bc5-8aa9-cff855f3927f","surname":"0c1240f5-649a-4bc5-8aa9-cff855f3927f"}

Killing app 1.0.0

Starting app in version 3.0.0

Generate a person in version 2.0.0
Sending a post to 127.0.0.1:9992/person. This is the response:
{"firstName":"74d84a9e-5f44-43b8-907c-148c6d26a71b","lastName":"74d84a9e-5f44-43b8-907c-148c6d26a71b","surname":"74d84a9e-5f44-43b8-907c-148c6d26a71b"}

Generate a person in version 3.0.0
Sending a post to 127.0.0.1:9993/person. This is the response:
{"firstName":"c6564dbe-9ab5-40ae-9077-8ae6668d5862","surname":"c6564dbe-9ab5-40ae-9077-8ae6668d5862"}

Killing app 2.0.0

Starting app in version 4.0.0

Generate a person in version 3.0.0
Sending a post to 127.0.0.1:9993/person. This is the response:

{"firstName":"cbe942fc-832e-45e9-a838-0fae25c10a51","surname":"cbe942fc-832e-45e9-a838-0fae25c10a51"}

Generate a person in version 4.0.0
Sending a post to 127.0.0.1:9994/person. This is the response:

{"firstName":"ff6857ce-9c41-413a-863e-358e2719bf88","surname":"ff6857ce-9c41-413a-863e-358e2719bf88"}

DB ืขื ื“ืขืจื•ื ื’ืขืŸ

ื•ื•ืขื’ืŸ v3 ืžื™ืจ ื ืึธืจ ืึทืจืึธืคึผื ืขืžืขืŸ ื“ื™ ื–ื™ื™ึทืœ last_name ืื•ืŸ ืœื™ื™ื’ืŸ ืคืขืœื ื“ื™ืง ืจื™ืกื˜ืจื™ืงืฉืึทื ื–.

-- REMOVE THE COLUMN
ALTER TABLE PERSON DROP last_name;

-- ADD CONSTRAINTS
UPDATE PERSON SET surname='' WHERE surname IS NULL;
ALTER TABLE PERSON ALTER COLUMN surname VARCHAR NOT NULL;

ืงืึธื“ ืขื ื“ืขืจื•ื ื’ืขืŸ

ืขืก ื–ืขื ืขืŸ ืงื™ื™ืŸ ืขื ื“ืขืจื•ื ื’ืขืŸ ืฆื• ื“ื™ ืงืึธื“.

ืจืขื–ื•ืœื˜ืึทื˜

ืžื™ืจ ื”ืฆืœื—ื” ื’ืขื•ื•ืขื ื“ื˜ ืึท ืงืึทืคึผื•ื™ืขืจ-ื™ื ืงืึทืžืคึผืึทื˜ืึทื‘ืึทืœ ื–ื™ื™ึทืœ ื ืึธืžืขืŸ ื˜ื•ื™ืฉืŸ ื“ื•ืจืš ืคึผืขืจืคืึธืจืžื™ื ื’ ืขื˜ืœืขื›ืข ืงืึทืคึผื•ื™ืขืจ-ืงืึทืžืคึผืึทื˜ืึทื‘ืึทืœ ื“ื™ืคึผืœื•ื™ืžืึทื ืฅ. ื•ื ื˜ืขืจ ืื™ื– ืึท ืงื™ืฆืขืจ ืคื•ืŸ ื“ื™ ืึทืงืฉืึทื ื– ื’ืขื˜ืืŸ:

  1. ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ืคื•ืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื•ื•ืขืจืกื™ืข 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. ืื•ื™ืš ืึท ื‘ืึทื’ืจืขื ืขืฆื•ื ื’ ื ื™ืฉื˜ ื ื•ืœ ืืจืืคื’ืขื ื•ืžืขืŸ ืคื•ืŸ last_name. ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก ืื™ื– ืื™ืฆื˜ ืื™ืŸ ื•ื•ืขืจืกื™ืข v3
  4. ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ืคื•ืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื•ื•ืขืจืกื™ืข 4.0.0 - ืงื™ื™ืŸ ืขื ื“ืขืจื•ื ื’ืขืŸ ื–ืขื ืขืŸ ื’ืขืžืื›ื˜ ืฆื• ื“ื™ ืงืึธื“. ื“ืึทื˜ืึทื‘ืึทืกืข ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ v4, ื•ื•ืึธืก ืจื™ืžื•ื•ื•ื– last_name. ื“ืึธ ืื™ืจ ืงืขื ืขืŸ ืœื™ื™ื’ืŸ ืงื™ื™ืŸ ืคืขืœื ื“ื™ืง ืงืึทื ืกื˜ืจื™ื™ื ืฅ ืฆื• ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก.

ื“ื•ืจืš ื“ืขื ืฆื•ื’ืึทื ื’, ืื™ืจ ืงืขื ืขืŸ ืฉื˜ืขื ื“ื™ืง ืฆื•ืจื™ืงืงืจื™ื’ืŸ ืื™ื™ืŸ ื•ื•ืขืจืกื™ืข ืึธืŸ ื‘ืจื™ื™ืงื™ื ื’ ื“ืึทื˜ืึทื‘ื™ื™ืก / ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืงืึทืžืคึผืึทื˜ืึทื‘ื™ืœืึทื˜ื™.

ืงืึธื“ืขืงืก

ื›ืœ ืงืึธื“ ื’ืขื ื™ืฆื˜ ืื™ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ ืื™ื– ื‘ื ื™ืžืฆื ืื™ืŸ ื’ื™ื˜ื”ื•ื‘. ื•ื ื˜ืขืจ ืื™ื– ื ืึธืš ื‘ืึทืฉืจื™ื™ึทื‘ื•ื ื’.

ืคึผืจืึทื“ื–ืฉืขืงืก

ื ืึธืš ืงืœืึธื•ื ื™ื ื’ ื“ื™ ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™, ืื™ืจ ื•ื•ืขื˜ ื–ืขืŸ ื“ื™ ืคืืœื’ืขื ื“ืข ื˜ืขืงืข ืกื˜ืจื•ืงื˜ื•ืจ.

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

ืกืงืจื™ืคึผืก

ืื™ืจ ืงืขื ืขืŸ ืœื•ื™ืคืŸ ื“ื™ ืกืงืจื™ืคึผืก ื“ื™ืกืงืจื™ื™ื‘ื“ ืื™ืŸ ื“ื™ ืกืงืจื™ืคึผืก ืื•ื ื˜ืŸ, ื•ื•ืึธืก ื•ื•ืขื˜ ื‘ืึทื•ื•ื™ื™ึทื–ืŸ ืฆื•ืจื™ืง-ืงืึทืžืคึผืึทื˜ืึทื‘ืึทืœ ืื•ืŸ ื™ื ืงืึทืžืคึผืึทื˜ืึทื‘ืึทืœ ืขื ื“ืขืจื•ื ื’ืขืŸ ืฆื• ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก.

ืฆื• ื–ืขืŸ ื“ืขืจ ืคืึทืœ ืžื™ื˜ ืงืึทืคึผื•ื™ืขืจ ืงืึทืžืคึผืึทื˜ืึทื‘ืึทืœ ืขื ื“ืขืจื•ื ื’ืขืŸ, ืœื•ื™ืฃ:

./scripts/scenario_backward_compatible.sh

ืื•ืŸ ืฆื• ื–ืขืŸ ืคืึทืœ ืžื™ื˜ ืงืึทืคึผื•ื™ืขืจ ื™ื ืงืึทืžืคึผืึทื˜ืึทื‘ืึทืœ ืขื ื“ืขืจื•ื ื’ืขืŸ, ืœื•ื™ืฃ:

./scripts/scenario_backward_incompatible.sh

ืคืจื™ืœื™ื ื’ ืฉื˜ื™ื•ื•ืœ ืกืึทืžืคึผืœืข ืคืœื™ื•ื•ื™ื™ึท

ืึทืœืข ื‘ื™ื™ืฉืคื™ืœืŸ ื–ืขื ืขืŸ ื’ืขื ื•ืžืขืŸ ืคื•ืŸ Spring Boot Sample Flyway.

ืื™ืจ ืงืขื ืขืŸ ื ืขืžืขืŸ ืึท ืงื•ืง ื‘ื™ื™ึท http://localhost:8080/flyway, ืขืก ืื™ื– ืึท ืจืฉื™ืžื” ืคื•ืŸ ืกืงืจื™ืคึผืก.

ื“ืขืจ ื‘ื™ื™ืฉืคึผื™ืœ ืื•ื™ืš ื›ื•ืœืœ ื“ื™ H2 ืงืึทื ืกืึธื•ืœ (ื‘ื™ื™ึท http://localhost:8080/h2-console) ืึทื–ื•ื™ ืื™ืจ ืงืขื ืขืŸ ื–ืขืŸ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก ืกื˜ืึทื˜ื•ืก (ืคืขืœื™ืงื™ื™ึทื˜ jdbc URL ืื™ื– jdbc:h2:mem:testdb).

ืึทื“ื“ื™ื˜ื™ืึธื ืึทืœืœื™

ืœื™ื™ืขื ืขืŸ ืื•ื™ืš ืื ื“ืขืจืข ืึทืจื˜ื™ืงืœืขืŸ ืื•ื™ืฃ ืื•ื ื“ื–ืขืจ ื‘ืœืึธื’:

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’