Π’Π°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΠΎΠ±ΡΡΠ½ΡΠ²Π° ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΊΠ°ΠΊ Π΄Π° ΡΠ°Π·ΡΠ΅ΡΠΈΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΡΡΡ ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡΠ° Π½Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ ΠΏΡΠΈ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅. Π©Π΅ Π²ΠΈ ΠΊΠ°ΠΆΠ΅ΠΌ ΠΊΠ°ΠΊΠ²ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ»ΡΡΠΈ Ρ Π²Π°ΡΠΈΡΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π°ΠΊΠΎ ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΡΠ΅ Π΄Π° Π²Π½Π΅Π΄ΡΠΈΡΠ΅ Π±Π΅Π· ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½Π° ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ°. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ ΠΏΡΠ΅Π· Π΅ΡΠ°ΠΏΠΈΡΠ΅ Π½Π° ΠΆΠΈΠ·Π½Π΅Π½ΠΈΡ ΡΠΈΠΊΡΠ» Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, ΠΊΠΎΠΈΡΠΎ ΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ, Π·Π° Π΄Π° ΠΈΠΌΠ° Π½ΡΠ»Π΅Π² ΠΏΡΠ΅ΡΡΠΎΠΉ (ΠΏΡΠΈΠ±Π». Π»Π΅Π½ΡΠ°: ΠΏΠΎ-Π½Π°ΡΠ°ΡΡΠΊ - Π½ΡΠ»Π΅Π² ΠΏΡΠ΅ΡΡΠΎΠΉ). Π Π΅Π·ΡΠ»ΡΠ°ΡΡΡ ΠΎΡ Π½Π°ΡΠΈΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΡΠΈΠ»Π°Π³Π°Π½Π΅ΡΠΎ Π½Π° ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π½Π΅ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠ°ΡΠ° ΠΏΡΠΎΠΌΡΠ½Π° Π½Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ ΠΏΠΎ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌ Π½Π°ΡΠΈΠ½.
ΠΠΊΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠΈΡΠ΅ Π·Π° ΠΊΠΎΠ΄ ΠΎΡ ΡΡΠ°ΡΠΈΡΡΠ°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΈ Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π½Π°
Π²ΡΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
Π Π°Π·Π³ΡΡΡΠ°Π½Π΅ Ρ Π½ΡΠ»Π΅Π²ΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΏΡΠ΅ΡΡΠΎΠΉ
ΠΠ°ΠΊΠ²Π° ΠΌΠΈΡΡΠΈΠΊΠ° ΡΠ°Π·Π³ΡΡΡΠ°Π½Π΅ Ρ Π½ΡΠ»Π΅Π²ΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΏΡΠ΅ΡΡΠΎΠΉ? ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΊΠ°ΠΆΠ΅ΡΠ΅, ΡΠ΅ ΡΠΎΠ²Π° Π΅, ΠΊΠΎΠ³Π°ΡΠΎ Π²Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΅ ΡΠ°Π·Π³ΡΡΠ½Π°ΡΠΎ ΠΏΠΎ ΡΠ°ΠΊΡΠ² Π½Π°ΡΠΈΠ½, ΡΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΡΠΏΠ΅ΡΠ½ΠΎ Π΄Π° Π²ΡΠ²Π΅Π΄Π΅ΡΠ΅ Π½ΠΎΠ²Π° Π²Π΅ΡΡΠΈΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎΡΠΎ, Π΄ΠΎΠΊΠ°ΡΠΎ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΡ Π½Π΅ Π·Π°Π±Π΅Π»ΡΠ·Π²Π° Π»ΠΈΠΏΡΠ°ΡΠ° ΠΌΡ. ΠΡ Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ° Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ ΠΈ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΡΠ°, ΡΠΎΠ²Π° Π΅ Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠΈΡΡ Π²ΡΠ·ΠΌΠΎΠΆΠ΅Π½ ΡΡΠ΅Π½Π°ΡΠΈΠΉ Π·Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅, Π·Π°ΡΠΎΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π²ΡΠ²Π΅ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° Π½ΠΎΠ²ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈ ΠΊΠΎΡΠΈΠ³ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π³ΡΠ΅ΡΠΊΠΈ Π±Π΅Π· ΠΏΡΠ΅ΠΊΡΡΠ²Π°Π½Π΅.
ΠΠ°ΠΊ Π΄Π° ΠΏΠΎΡΡΠΈΠ³Π½Π΅ΠΌ ΡΠΎΠ²Π°? ΠΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π½Π°ΡΠΈΠ½Π°, Π΅ΡΠΎ Π΅Π΄ΠΈΠ½ ΠΎΡ ΡΡΡ :
- Π²Π½Π΅Π΄ΡΠΈΡΠ΅ Π²Π΅ΡΡΠΈΡ β1 Π½Π° Π²Π°ΡΠ°ΡΠ° ΡΡΠ»ΡΠ³Π°
- ΠΈΠ·Π²ΡΡΡΠ΅ΡΠ΅ ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ
- Π Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅ΡΠ΅ Π²Π΅ΡΡΠΈΡ #2 Π½Π° Π²Π°ΡΠ°ΡΠ° ΡΡΠ»ΡΠ³Π° ΡΡΠΏΠΎΡΠ΅Π΄Π½ΠΎ Ρ Π²Π΅ΡΡΠΈΡ #1
- Π²Π΅Π΄Π½Π°Π³Π° ΡΠΎΠΌ Π²ΠΈΠ΄ΠΈΡΠ΅, ΡΠ΅ Π²Π΅ΡΡΠΈΡ β 2 ΡΠ°Π±ΠΎΡΠΈ ΠΊΠ°ΠΊΡΠΎ ΡΡΡΠ±Π²Π°, ΠΏΡΠ΅ΠΌΠ°Ρ Π½Π΅ΡΠ΅ Π²Π΅ΡΡΠΈΡ β 1
- Π³ΠΎΡΠΎΠ²!
ΠΠ΅ΡΠ½ΠΎ, Π½Π°Π»ΠΈ? ΠΠ° ΡΡΠΆΠ°Π»Π΅Π½ΠΈΠ΅ Π½Π΅ Π΅ ΡΠΎΠ»ΠΊΠΎΠ²Π° ΠΏΡΠΎΡΡΠΎ ΠΈ ΡΠ΅ Π³ΠΎ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ. Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ Π΄ΡΡΠ³ Π΄ΠΎΡΡΠ° ΡΠ΅ΡΡΠΎ ΡΡΠ΅ΡΠ°Π½ ΠΏΡΠΎΡΠ΅Ρ Π½Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ - ΡΠΈΠ½ΡΠΎ-Π·Π΅Π»Π΅Π½ΠΎ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅.
Π§ΡΠ²Π°Π»ΠΈ Π»ΠΈ ΡΡΠ΅ Π½ΡΠΊΠΎΠ³Π°
- ΡΠ²Π΅ΡΠ΅ΡΠ΅ ΡΠ΅, ΡΠ΅ Π΄Π²Π΅ ΠΊΠΎΠΏΠΈΡ Π½Π° Π²Π°ΡΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½ ΠΊΠΎΠ΄ (βΡΠΈΠ½ΡΠΎβ ΠΈ βΠ·Π΅Π»Π΅Π½ΠΎβ) ΡΠ°Π±ΠΎΡΡΡ;
- Π½Π°ΡΠΎΡΠΈ ΡΠ΅Π»ΠΈΡ ΡΡΠ°ΡΠΈΠΊ ΠΊΡΠΌ ΡΠΈΠ½ΡΡΠ° ΡΡΠ΅Π΄Π°, Ρ.Π΅. ΡΠ°ΠΊΠ° ΡΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½ΠΈΡΠ΅ URL Π°Π΄ΡΠ΅ΡΠΈ Π΄Π° ΡΠΎΡΠ°Ρ ΡΠ°ΠΌ;
- Π²Π½Π΅Π΄ΡΠΈΡΠ΅ ΠΈ ΡΠ΅ΡΡΠ²Π°ΠΉΡΠ΅ Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π² Π·Π΅Π»Π΅Π½Π° ΡΡΠ΅Π΄Π°;
- ΠΏΡΠ΅Π²ΠΊΠ»ΡΡΠ΅ΡΠ΅ URL Π°Π΄ΡΠ΅ΡΠΈΡΠ΅ ΠΎΡ ΡΠΈΠ½Ρ ΠΊΡΠΌ Π·Π΅Π»Π΅Π½Π° ΡΡΠ΅Π΄Π°
Π‘ΠΈΠ½ΡΠΎ-Π·Π΅Π»Π΅Π½ΠΎΡΠΎ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄, ΠΊΠΎΠΉΡΠΎ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π»Π΅ΡΠ½ΠΎ Π΄Π° Π²ΡΠ²Π΅ΠΆΠ΄Π°ΡΠ΅ Π½ΠΎΠ²ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, Π±Π΅Π· Π΄Π° ΡΠ΅ ΠΏΡΠΈΡΠ΅ΡΠ½ΡΠ²Π°ΡΠ΅ ΠΎΡ ΠΏΡΠ΅ΠΊΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎΡΠΎ. Π’ΠΎΠ²Π° ΡΠ΅ Π΄ΡΠ»ΠΆΠΈ Π½Π° ΡΠ°ΠΊΡΠ°, ΡΠ΅ Π΄ΠΎΡΠΈ Π°ΠΊΠΎ Π½Π΅ΡΠΎ ΡΠ΅ ΡΠ»ΡΡΠΈ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π»Π΅ΡΠ½ΠΎ Π΄Π° ΡΠ΅ Π²ΡΡΠ½Π΅ΡΠ΅ ΠΊΡΠΌ ΠΏΡΠ΅Π΄ΠΈΡΠ½Π°ΡΠ° ΡΡΠ΅Π΄Π°, ΠΊΠ°ΡΠΎ ΠΏΡΠΎΡΡΠΎ βΠ½Π°ΡΠΈΡΠ½Π΅ΡΠ΅ ΠΏΡΠ΅Π²ΠΊΠ»ΡΡΠ²Π°ΡΠ΅Π»β.
Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ ΠΏΡΠΎΡΠ΅ΡΠ΅ΡΠ΅ Π²ΡΠΈΡΠΊΠΎ ΠΏΠΎ-Π³ΠΎΡΠ΅, ΠΌΠΎΠΆΠ΅ Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΡΠ΅ Π²ΡΠΏΡΠΎΡΠ°: ΠΠ°ΠΊΠ²ΠΎ ΠΎΠ±ΡΠΎ ΠΈΠΌΠ° Π½ΡΠ»Π΅Π²ΠΈΡΡ ΠΏΡΠ΅ΡΡΠΎΠΉ ΡΡΡ ΡΠΈΠ½ΡΠΎ-Π·Π΅Π»Π΅Π½ΠΎΡΠΎ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅?
Π, ΡΠ΅ ΠΈΠΌΠ°Ρ Π΄ΠΎΡΡΠ° ΠΎΠ±ΡΠΈ Π½Π΅ΡΠ°, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½Π΅ΡΠΎ Π½Π° Π΄Π²Π΅ ΠΊΠΎΠΏΠΈΡ Π½Π° Π΅Π΄Π½Π° ΠΈ ΡΡΡΠ° ΡΡΠ΅Π΄Π° ΠΈΠ·ΠΈΡΠΊΠ²Π° Π΄Π²ΠΎΠΉΠ½ΠΎ ΡΡΠΈΠ»ΠΈΠ΅ Π·Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½Π΅ΡΠΎ ΠΈΠΌ. ΠΡΠΎ Π·Π°ΡΠΎ Π½ΡΠΊΠΎΠΈ ΠΎΡΠ±ΠΎΡΠΈ ΡΠ²ΡΡΠ΄ΡΡ
ΠΡΡΠ³ Π²Π°ΡΠΈΠ°Π½Ρ Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Π΅Π΄Π½Π° ΠΈ ΡΡΡΠ° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ, ΡΡΠ·Π΄Π°Π²Π°ΠΉΠΊΠΈ ΡΠΈΠ½ΡΠΎ-Π·Π΅Π»Π΅Π½ΠΈ ΠΏΡΠ΅Π²ΠΊΠ»ΡΡΠ²Π°ΡΠ΅Π»ΠΈ Π·Π° ΡΠ΅Π± ΠΈ Π΄ΠΎΠΌΠ΅ΠΉΠ½ ΡΠ»ΠΎΠ΅Π²Π΅. ΠΡΠΈ ΡΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ ΡΠ΅ΡΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΠΎΡΠΎΠ±Π΅Π½ΠΎ ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π½Π΅ΠΉΠ½Π°ΡΠ° ΡΡ Π΅ΠΌΠ°, Π·Π° Π΄Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° Π½ΠΎΠ²Π° Π²Π΅ΡΡΠΈΡ Π½Π° ΡΠΎΡΡΡΠ΅ΡΠ°.
Π ΡΡΠΊ ΡΡΠΈΠ³Π°ΠΌΠ΅ Π΄ΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π² ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ. Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ. ΠΠ΅ΠΊΠ° Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌ ΠΎΡΠ½ΠΎΠ²ΠΎ ΡΠ°Π·ΠΈ ΡΡΠ°Π·Π°.
ΠΈΠ·Π²ΡΡΡΠ΅ΡΠ΅ ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ.
Π‘Π΅Π³Π° ΡΡΡΠ±Π²Π° Π΄Π° ΡΠΈ Π·Π°Π΄Π°Π΄Π΅ΡΠ΅ Π²ΡΠΏΡΠΎΡΠ° - ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ΅ ΡΡΠ°Π½Π΅, Π°ΠΊΠΎ ΠΏΡΠΎΠΌΡΠ½Π°ΡΠ° Π½Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ Π½Π΅ Π΅ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠ°? ΠΡΠΌΠ° Π»ΠΈ ΠΏΡΡΠ²Π°ΡΠ° ΠΌΠΈ Π²Π΅ΡΡΠΈΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π΄Π° ΡΠ΅ ΠΏΠΎΠ²ΡΠ΅Π΄ΠΈ? ΠΡΡΡΠ½ΠΎΡΡ ΡΠΎΡΠ½ΠΎ ΡΠΎΠ²Π° ΡΠ΅ ΡΠ΅ ΡΠ»ΡΡΠΈ...
Π’Π°ΠΊΠ° ΡΠ΅, Π΄ΠΎΡΠΈ Π²ΡΠΏΡΠ΅ΠΊΠΈ ΠΎΠ³ΡΠΎΠΌΠ½ΠΈΡΠ΅ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π° Π½Π° Π½ΡΠ»Π΅Π²ΠΈΡ ΠΏΡΠ΅ΡΡΠΎΠΉ/ΡΠΈΠ½ΡΠΎ-Π·Π΅Π»Π΅Π½ΠΎ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅, ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈΡΠ΅ ΡΠ° ΡΠΊΠ»ΠΎΠ½Π½ΠΈ Π΄Π° ΡΠ»Π΅Π΄Π²Π°Ρ ΡΠ»Π΅Π΄Π½ΠΈΡ ΠΏΠΎ-Π±Π΅Π·ΠΎΠΏΠ°ΡΠ΅Π½ ΠΏΡΠΎΡΠ΅Ρ Π·Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° ΡΠ²ΠΎΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ:
- ΠΏΠΎΠ΄Π³ΠΎΡΠ²ΠΈ ΠΏΠ°ΠΊΠ΅Ρ Ρ Π½ΠΎΠ²Π° Π²Π΅ΡΡΠΈΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ
- Π·Π°ΡΠ²ΠΎΡΠ΅ΡΠ΅ ΡΠ°Π±ΠΎΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
- ΡΡΠ°ΡΡΠΈΡΠ°ΠΉΡΠ΅ ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ Π·Π° ΠΌΠΈΠ³ΡΠΈΡΠ°Π½Π΅ Π½Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ
- Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Π½ΠΎΠ²Π° Π²Π΅ΡΡΠΈΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ
Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΠΎΠΏΠΈΡΠ΅ΠΌ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ°Π±ΠΎΡΠΈΡΠ΅ Ρ Π²Π°ΡΠ°ΡΠ° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΈ ΠΊΠΎΠ΄, Π·Π° Π΄Π° ΡΠ΅ Π²ΡΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΎΡ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ΡΠΎ Π±Π΅Π· ΠΏΡΠ΅ΡΡΠΎΠΉ.
ΠΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ
ΠΠΊΠΎ ΠΈΠΌΠ°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±Π΅Π· ΡΡΡΡΠΎΡΠ½ΠΈΠ΅, ΠΊΠΎΠ΅ΡΠΎ Π½Π΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π° Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ Π΄Π°Π½Π½ΠΈ Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²Π΅Π΄Π½Π°Π³Π° Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ Π½ΡΠ»Π΅Π²ΠΎ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠ΅ΡΡΠΎΠΉ. ΠΠ° ΡΡΠΆΠ°Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΡΠΎΡΡΡΠ΅ΡΠΈ ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΡ ΡΠ°Π½ΡΠ²Π°Ρ Π΄Π°Π½Π½ΠΈ Π½ΡΠΊΡΠ΄Π΅. ΠΡΠΎ Π·Π°ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΠΌΠΈΡΠ»ΠΈΡΠ΅ Π΄Π²Π° ΠΏΡΡΠΈ, ΠΏΡΠ΅Π΄ΠΈ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΊΠ°ΠΊΠ²ΠΈΡΠΎ ΠΈ Π΄Π° Π±ΠΈΠ»ΠΎ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π²ΡΠ² Π²Π΅ΡΠΈΠ³Π°ΡΠ°. ΠΡΠ΅Π΄ΠΈ Π΄Π° Π½Π°Π²Π»Π΅Π·Π΅ΠΌ Π² ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ Π·Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊ Π΄Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ ΡΡ Π΅ΠΌΠ°ΡΠ°, ΡΠ°ΠΊΠ° ΡΠ΅ Π΄Π° Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π±Π΅Π· ΠΏΡΠ΅ΡΡΠΎΠΉ, Π½Π΅ΠΊΠ° ΠΏΡΡΠ²ΠΎ ΡΠ΅ ΡΡΡΡΠ΅Π΄ΠΎΡΠΎΡΠΈΠΌ Π²ΡΡΡ Ρ ΡΡ Π΅ΠΌΠ°ΡΠ° Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Π²Π΅ΡΡΠΈΠΈΡΠ΅.
Π‘Ρ Π΅ΠΌΠ° Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Π²Π΅ΡΡΠΈΠΈΡΠ΅
Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ classpath:db/migration
). Π’ΡΠΊ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΡΠ°ΠΊΠΈΠ²Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π·Π° ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ
βββ db
βββ migration
βββ V1__init.sql
βββ V2__Add_surname.sql
βββ V3__Final_migration.sql
βββ V4__Remove_lastname.sql
Π ΡΠΎΠ·ΠΈ ΠΏΡΠΈΠΌΠ΅Ρ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ 4 ΡΠΊΡΠΈΠΏΡΠ° Π·Π° ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ, ΠΊΠΎΠΈΡΠΎ, Π°ΠΊΠΎ Π½Π΅ Π±ΡΠ΄Π°Ρ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈ ΠΏΡΠ΅Π΄ΠΈ ΡΠΎΠ²Π°, ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈ Π΅Π΄ΠΈΠ½ ΡΠ»Π΅Π΄ Π΄ΡΡΠ³, ΠΊΠΎΠ³Π°ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ°. ΠΠ΅ΠΊΠ° Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π΅Π΄ΠΈΠ½ ΠΎΡ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅ (V1__init.sql
) ΠΊΠ°ΡΠΎ ΠΏΡΠΈΠΌΠ΅Ρ.
CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);
insert into PERSON (first_name, last_name) values ('Dave', 'Syer');
ΠΡΠΈΡΠΊΠΎ Π΅ Π½Π°ΠΏΡΠ»Π½ΠΎ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ: ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ SQL, Π·Π° Π΄Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΠ΅ ΠΊΠ°ΠΊ Π²Π°ΡΠ°ΡΠ° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠ°Π½Π°. ΠΠ° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΡΠ½ΠΎΡΠ½ΠΎ Spring Boot ΠΈ Flyway Π²ΠΈΠΆΡΠ΅
ΠΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π·Π° ΠΊΠΎΠ½ΡΡΠΎΠ» Π½Π° ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊΠ° Ρ Spring Boot, ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΡΠ΅ 2 Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π°:
- ΡΠ°Π·Π΄Π΅Π»ΡΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ ΠΎΡ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π² ΠΊΠΎΠ΄Π°
- ΠΠΈΠ³ΡΠ°ΡΠΈΡΡΠ° Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° Π·Π°Π΅Π΄Π½ΠΎ Ρ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π²Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Ρ.Π΅. Π²Π°ΡΠΈΡΡ ΠΏΡΠΎΡΠ΅Ρ Π½Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π΅ ΠΎΠΏΡΠΎΡΡΠ΅Π½
ΠΡΡΡΡΠ°Π½ΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ
Π ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡ ΡΠ°Π·Π΄Π΅Π» Π½Π° ΡΡΠ°ΡΠΈΡΡΠ° ΡΠ΅ ΡΠ΅ ΡΡΡΡΠ΅Π΄ΠΎΡΠΎΡΠΈΠΌ Π²ΡΡΡ Ρ ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° Π΄Π²Π° ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π° ΠΊΡΠΌ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ.
- ΠΎΠ±ΡΠ°ΡΠ½Π° Π½Π΅ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡ
- ΠΎΠ±ΡΠ°ΡΠ½Π° ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡ
ΠΡΡΠ²ΠΈΡΡ ΡΠ΅ ΡΠ΅ ΡΡΠΈΡΠ° Π·Π° ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅, ΡΠ΅ Π½Π΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Ρ Π½ΡΠ»Π΅Π² ΠΏΡΠ΅ΡΡΠΎΠΉ Π±Π΅Π· ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½Π° ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ°... ΠΡΠΎΡΠΈΡΡ ΠΏΡΠ΅Π΄Π»Π°Π³Π° ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π·Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·Π²ΡΡΡΠΈΡΠ΅ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π±Π΅Π· ΠΏΡΠ΅ΡΡΠΎΠΉ ΠΈ Π² ΡΡΡΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ Π΄Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°ΡΠ΅ ΠΎΠ±ΡΠ°ΡΠ½Π° ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡ.
ΠΠ°ΡΠΈΡΡ ΠΏΡΠΎΠ΅ΠΊΡ, Π²ΡΡΡ
Ρ ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈΠΌ, ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Spring Boot Flyway, ΠΊΠΎΠ΅ΡΠΎ ΠΈΠΌΠ° Person
Ρ first_name
ΠΈ last_name
Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ (ΠΏΡΠΈΠ±Π». ΠΏΡΠ΅Π²ΠΎΠ΄: Person
Π΅ ΠΌΠ°ΡΠ° ΠΈ first_name
ΠΈ last_name
- ΡΠΎΠ²Π° ΡΠ° Π½ΠΈΠ²ΠΈΡΠ΅ Π² Π½Π΅Π³ΠΎ). ΠΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΠΏΡΠ΅ΠΈΠΌΠ΅Π½ΡΠ²Π°ΠΌΠ΅ last_name
Π² surname
.
ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
ΠΡΠ΅Π΄ΠΈ Π΄Π° Π½Π°Π²Π»Π΅Π·Π΅ΠΌ Π² ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈΡΠ΅, ΠΈΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΠΈΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΠΎΡΠ½ΠΎΡΠ½ΠΎ Π½Π°ΡΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΡΠ½ΠΎΠ²Π½ΠΈΡΡ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ, ΠΊΠΎΠΉΡΠΎ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΠΏΠΎΡΡΠΈΠ³Π½Π΅ΠΌ, ΡΠ΅ Π±ΡΠ΄Π΅ Π΄ΠΎΡΡΠ° ΠΏΡΠΎΡΡ ΠΏΡΠΎΡΠ΅Ρ.
ΠΠ΅Π»Π΅ΠΆΠΊΠ°ΡΠ°. ΠΠΈΠ·Π½Π΅Ρ ΠΠ Π-Π‘ΠͺΠΠΠ’. ΠΠΏΡΠΎΡΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΈΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π²ΠΈ ΡΠΏΠ΅ΡΡΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠ°ΡΠΈ Π·Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° (ΠΊΠΎΠ»ΠΊΠΎΡΠΎ ΠΏΠΎΠ²Π΅ΡΠ΅ Ρ ΠΎΡΠ° ΡΠ°Π±ΠΎΡΡΡ Π·Π° Π²Π°ΡΠ°ΡΠ° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ, ΡΠΎΠ»ΠΊΠΎΠ²Π° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΏΠ°ΡΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠΏΠ΅ΡΡΠΈΡΠ΅)!
ΠΡΠΌΠ° Π½ΡΠΆΠ΄Π° ΠΎΡ Π²ΡΡΡΠ°Π½Π΅ Π½Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ
Π’ΠΎΠ²Π° ΠΎΠΏΡΠΎΡΡΡΠ²Π° ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ (Π½ΡΠΊΠΎΠΈ Π²ΡΡΡΠ°Π½ΠΈΡ Π½Π°Π·Π°Π΄ ΠΊΡΠΌ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ ΡΠ° ΠΏΠΎΡΡΠΈ Π½Π΅Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΈ, ΠΊΠ°ΡΠΎ Π²ΡΡΡΠ°Π½Π΅ ΠΊΡΠΌ ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅). ΠΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°ΠΌΠ΅ Π΄Π° Π²ΡΡΡΠ°ΠΌΠ΅ ΡΠ°ΠΌΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½, Π΄ΠΎΡΠΈ Π°ΠΊΠΎ ΠΈΠΌΠ°ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ SQL ΠΈ NoSQL), Π²Π°ΡΠΈΡΡ ΠΊΠ°Π½Π°Π» Π·Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ ΡΠ΅ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΠΎ ΡΡΡΠΈΡ Π½Π°ΡΠΈΠ½.
ΠΠΠΠΠΠ ΡΡΡΠ±Π²Π° Π΄Π° Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π΄Π° ΡΠ΅ Π²ΡΡΠ½Π΅ Π΅Π΄Π½Π° Π²Π΅ΡΡΠΈΡ Π½Π°Π·Π°Π΄ (Π½Π΅ ΠΏΠΎΠ²Π΅ΡΠ΅)
ΠΡΡΡΠ°Π½Π΅ Π½Π°Π·Π°Π΄ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΡΠ°ΠΌΠΎ ΠΊΠΎΠ³Π°ΡΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ. ΠΠΊΠΎ ΠΈΠΌΠ° Π³ΡΠ΅ΡΠΊΠ° Π² ΡΠ΅ΠΊΡΡΠ°ΡΠ° Π²Π΅ΡΡΠΈΡ, ΠΊΠΎΡΡΠΎ Π½Π΅ ΡΠ΅ ΠΊΠΎΡΠΈΠ³ΠΈΡΠ° Π»Π΅ΡΠ½ΠΎ, ΡΡΡΠ±Π²Π° Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠ΅ Π²ΡΡΠ½Π΅ΠΌ ΠΊΡΠΌ Π½Π°ΠΉ-Π½ΠΎΠ²Π°ΡΠ° ΡΠ°Π±ΠΎΡΠ΅ΡΠ° Π²Π΅ΡΡΠΈΡ. ΠΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΠΌΠ΅, ΡΠ΅ ΡΠ°Π·ΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π½Π° ΡΠ°Π±ΠΎΡΠ½Π° Π²Π΅ΡΡΠΈΡ Π΅ ΠΏΡΠ΅Π΄ΠΈΡΠ½Π°ΡΠ°. ΠΠΎΠ΄Π΄ΡΡΠΆΠ°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡ Π½Π° ΠΊΠΎΠ΄ ΠΈ Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ Π·Π° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ Π΅Π΄Π½ΠΎ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π±ΠΈ Π±ΠΈΠ»ΠΎ ΠΈΠ·ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΡΡΡΠ΄Π½ΠΎ ΠΈ ΡΠΊΡΠΏΠΎ.
ΠΠ΅Π»Π΅ΠΆΠΊΠ°ΡΠ°. ΠΠ° ΠΏΠΎ-Π³ΠΎΠ»ΡΠΌΠ° ΡΠ΅ΡΠ»ΠΈΠ²ΠΎΡΡ Π² ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΠΌ ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ.
Π‘ΡΡΠΏΠΊΠ° 1: ΠΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΎ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅
ΠΠ΅ΡΡΠΈΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ: 1.0.0
DB Π²Π΅ΡΡΠΈΡ: v1
ΠΠΎΠΌΠ΅Π½ΡΠ°Ρ
Π’ΠΎΠ²Π° ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΎΡΠΎ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ.
ΠΡΠΎΠΌΠ΅Π½ΠΈ Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ
DB ΡΡΠ΄ΡΡΠΆΠ° last_name.
CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);
insert into PERSON (first_name, last_name) values ('Dave', 'Syer');
ΠΡΠΎΠΌΠ΅Π½ΠΈ Π² ΠΊΠΎΠ΄Π°
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΡΡ
ΡΠ°Π½ΡΠ²Π° Π΄Π°Π½Π½ΠΈ Π·Π° Π»ΠΈΡΠ° Π² last_name
:
/*
* Copyright 2012-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package sample.flyway;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Person {
@Id
@GeneratedValue
private Long id;
private String firstName;
private String lastName;
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return this.lastName;
}
public void setLastName(String lastname) {
this.lastName = lastname;
}
@Override
public String toString() {
return "Person [firstName=" + this.firstName + ", lastName=" + this.lastName
+ "]";
}
}
ΠΠ±ΡΠ°ΡΠ½ΠΎ Π½Π΅ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎ ΠΏΡΠ΅ΠΈΠΌΠ΅Π½ΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ»ΠΎΠ½ΠΈ
ΠΠ΅ΠΊΠ° Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΡΠΈΠΌΠ΅Ρ ΠΊΠ°ΠΊ Π΄Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠ»ΠΎΠ½Π°:
Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅. Π‘Π»Π΅Π΄Π²Π°ΡΠΈΡΡ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠΌΠΈΡΠ»Π΅Π½ΠΎ ΡΠ΅ Π½Π°ΡΡΡΠΈ Π½Π΅ΡΠ°ΡΠ°. ΠΠΎΠΊΠ°Π·Π²Π°ΠΌΠ΅ ΡΠΎΠ²Π°, Π·Π° Π΄Π° Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΡΡ ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡΠ° Π½Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ.
ΠΠ΅ΡΡΠΈΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ: 2.0.0.BAD
DB Π²Π΅ΡΡΠΈΡ: v2bad
ΠΠΎΠΌΠ΅Π½ΡΠ°Ρ
Π’Π΅ΠΊΡΡΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ ΠΠ Π½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°ΠΌΠ΅ Π΄Π²Π΅ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΠΈ (ΡΡΠ°ΡΠ° ΠΈ Π½ΠΎΠ²Π°) Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ. ΠΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ ΡΠ΅ Π±ΡΠ΄Π΅ ΡΡΡΠ΄Π½ΠΎ Π΄Π° ΡΠ΅ ΠΏΠΎΡΡΠΈΠ³Π½Π΅ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Ρ Π½ΡΠ»Π΅Π²ΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΏΡΠ΅ΡΡΠΎΠΉ (Π°ΠΊΠΎ ΡΠ΅ Π²Π·Π΅ΠΌΠ°Ρ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄ Π΄ΠΎΠΏΡΡΠΊΠ°Π½ΠΈΡΡΠ°, Π²ΡΡΡΠ½ΠΎΡΡ Π΅ Π½Π΅Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ).
A/B ΡΠ΅ΡΡΠ²Π°Π½Π΅
Π’Π΅ΠΊΡΡΠ°ΡΠ° ΡΠΈΡΡΠ°ΡΠΈΡ Π΅, ΡΠ΅ ΠΈΠΌΠ°ΠΌΠ΅ Π²Π΅ΡΡΠΈΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ 1.0.0,
Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ ΠΈ Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ v1
. Π’ΡΡΠ±Π²Π° Π΄Π° Π²Π½Π΅Π΄ΡΠΈΠΌ Π²ΡΠΎΡΠΎ ΠΊΠΎΠΏΠΈΠ΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, Π²Π΅ΡΡΠΈΡ 2.0.0.BAD
ΠΈ Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°ΠΉΡΠ΅ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ Π΄ΠΎ v2bad
.
ΡΡΡΠΏΠΊΠΈ:
- Π΅ Π²Π½Π΅Π΄ΡΠ΅Π½ Π½ΠΎΠ² Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π·Π° Π²Π΅ΡΡΠΈΡ
2.0.0.BAD
ΠΊΠΎΠΉΡΠΎ Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ Π΄ΠΎv2bad
- Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ
v2bad
ΠΊΠΎΠ»ΠΎΠ½Π°last_name
Π²Π΅ΡΠ΅ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π° - Π±Π΅ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ΠΎ Π½Π°surname
- ΠΠΊΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π±Π΅ΡΠ΅ ΡΡΠΏΠ΅ΡΠ½Π° ΠΈ Π½ΡΠΊΠΎΠΈ ΠΊΠΎΠΏΠΈΡ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ
1.0.0
, Π΄ΡΡΠ³ΠΈ - Π²2.0.0.BAD
. ΠΡΠΈΡΠΊΠΎ Π΅ ΡΠ²ΡΡΠ·Π°Π½ΠΎ Ρ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈv2bad
- Π²ΡΠΈΡΠΊΠΈ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΈ Π½Π° Π²Π΅ΡΡΠΈΡΡΠ°
1.0.0
ΡΠ΅ Π·Π°ΠΏΠΎΡΠ½Π°Ρ Π΄Π° ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Ρ Π³ΡΠ΅ΡΠΊΠΈ, Π·Π°ΡΠΎΡΠΎ ΡΠ΅ ΡΠ΅ ΠΎΠΏΠΈΡΠ°Ρ Π΄Π° Π²ΠΌΡΠΊΠ½Π°Ρ Π΄Π°Π½Π½ΠΈ Π² ΠΊΠΎΠ»ΠΎΠ½Π°ΡΠ°last_name
ΠΊΠΎΠΉΡΠΎ Π²Π΅ΡΠ΅ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π° - Π²ΡΠΈΡΠΊΠΈ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΈ Π½Π° Π²Π΅ΡΡΠΈΡΡΠ°
2.0.0.BAD
ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ Π±Π΅Π· ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ
ΠΠ°ΠΊΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅, Π°ΠΊΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π½Π΅ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, A/B ΡΠ΅ΡΡΠ²Π°Π½Π΅ΡΠΎ Π΅ Π½Π΅Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ.
ΠΡΡΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ
ΠΠ° ΠΏΡΠΈΠ΅ΠΌΠ΅ΠΌ, ΡΠ΅ ΡΠ»Π΅Π΄ ΠΊΠ°ΡΠΎ ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΡΠ΅ Π΄Π° ΠΈΠ·Π²ΡΡΡΠΈΡΠ΅ A/B Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ (ΠΏΡΠΈΠ±Π». per.: ΡΡΠΊ Π°Π²ΡΠΎΡΡΡ Π²Π΅ΡΠΎΡΡΠ½ΠΎ Π΅ ΠΈΠΌΠ°Π» ΠΏΡΠ΅Π΄Π²ΠΈΠ΄ A/B ΡΠ΅ΡΡΠ²Π°Π½Π΅) ΡΠ΅ΡΠΈΡ
ΠΌΠ΅, ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° Π²ΡΡΠ½Π΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π΄ΠΎ Π²Π΅ΡΡΠΈΡΡΠ° 1.0.0.
ΠΠ° ΠΊΠ°ΠΆΠ΅ΠΌ, ΡΠ΅ Π½Π΅ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° Π²ΡΡΠ½Π΅ΠΌ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ.
ΡΡΡΠΏΠΊΠΈ:
- ΡΠΏΠΈΡΠ°ΠΌΠ΅ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π·Π° Π²Π΅ΡΡΠΈΡ
2.0.0.BAD
- Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ Π΅ Π²ΡΠ΅ ΠΎΡΠ΅
v2bad
- ΡΡΠΉ ΠΊΠ°ΡΠΎ Π²Π΅ΡΡΠΈΡΡΠ°
1.0.0
Π½Π΅ ΡΠ°Π·Π±ΠΈΡΠ° ΠΊΠ°ΠΊΠ²ΠΎ Π΅surname
, ΡΠ΅ Π²ΠΈΠ΄ΠΈΠΌ Π³ΡΠ΅ΡΠΊΠΈ - Π°Π΄ΡΡ ΠΈΠ·Π±ΡΡ Π½Π°, Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠ΅ Π²ΡΡΠ½Π΅ΠΌ ΠΏΠΎΠ²Π΅ΡΠ΅
ΠΠ°ΠΊΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅, Π°ΠΊΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π½Π΅ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠ΅ Π²ΡΡΠ½Π΅ΠΌ ΠΊΡΠΌ ΠΏΡΠ΅Π΄ΠΈΡΠ½Π°ΡΠ° Π²Π΅ΡΡΠΈΡ.
ΠΡΡΠ½Π°Π»ΠΈ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅
Backward incompatible scenario:
01) Run 1.0.0
02) Wait for the app (1.0.0) to boot
03) Generate a person by calling POST localhost:9991/person to version 1.0.0
04) Run 2.0.0.BAD
05) Wait for the app (2.0.0.BAD) to boot
06) Generate a person by calling POST localhost:9991/person to version 1.0.0 <-- this should fail
07) Generate a person by calling POST localhost:9992/person to version 2.0.0.BAD <-- this should pass
Starting app in version 1.0.0
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:
{"firstName":"b73f639f-e176-4463-bf26-1135aace2f57","lastName":"b73f639f-e176-4463-bf26-1135aace2f57"}
Starting app in version 2.0.0.BAD
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:
curl: (22) The requested URL returned error: 500 Internal Server Error
Generate a person in version 2.0.0.BAD
Sending a post to 127.0.0.1:9995/person. This is the response:
{"firstName":"e156be2e-06b6-4730-9c43-6e14cfcda125","surname":"e156be2e-06b6-4730-9c43-6e14cfcda125"}
ΠΡΠΎΠΌΠ΅Π½ΠΈ Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ
Π‘ΠΊΡΠΈΠΏΡ Π·Π° ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ, ΠΊΠΎΠΉΡΠΎ ΠΏΡΠ΅ΠΈΠΌΠ΅Π½ΡΠ²Π° last_name
Π² surname
ΠΠ·Ρ ΠΎΠ΄Π΅Π½ ΡΠΊΡΠΈΠΏΡ Π½Π° Flyway:
CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);
insert into PERSON (first_name, last_name) values ('Dave', 'Syer');
Π‘ΠΊΡΠΈΠΏΡ, ΠΊΠΎΠΉΡΠΎ ΠΏΡΠ΅ΠΈΠΌΠ΅Π½ΡΠ²Π° last_name
.
-- This change is backward incompatible - you can't do A/B testing
ALTER TABLE PERSON CHANGE last_name surname VARCHAR;
ΠΡΠΎΠΌΠ΅Π½ΠΈ Π² ΠΊΠΎΠ΄Π°
ΠΡΠΎΠΌΠ΅Π½ΠΈΡ
ΠΌΠ΅ ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΠΏΠΎΠ»Π΅ΡΠΎ lastName
Π½Π° surname
.
ΠΡΠ΅ΠΈΠΌΠ΅Π½ΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ»ΠΎΠ½Π° ΠΏΠΎ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌ Π½Π°ΡΠΈΠ½
Π’ΠΎΠ²Π° Π΅ Π½Π°ΠΉ-ΡΠ΅ΡΡΠ°ΡΠ° ΡΠΈΡΡΠ°ΡΠΈΡ, Ρ ΠΊΠΎΡΡΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠ΅ ΡΠ±Π»ΡΡΠΊΠ°ΠΌΠ΅. Π’ΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π½Π΅ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ. ΠΠ΅ΡΠ΅ Π΄ΠΎΠΊΠ°Π·Π°Ρ ΠΌΠ΅, ΡΠ΅ Π·Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π±Π΅Π· ΠΏΡΠ΅ΠΊΡΡΠ²Π°Π½Π΅ Π½Π΅ ΡΡΡΠ±Π²Π° ΠΏΡΠΎΡΡΠΎ Π΄Π° ΠΏΡΠΈΠ»Π°Π³Π°ΠΌΠ΅ ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ Π±Π΅Π· Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΡΡΡΠΏΠΊΠΈ. Π ΡΠΎΠ·ΠΈ ΡΠ°Π·Π΄Π΅Π» Π½Π° ΡΡΠ°ΡΠΈΡΡΠ° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠΈΠΌ 3 Π²Π½Π΅Π΄ΡΡΠ²Π°Π½ΠΈΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π·Π°Π΅Π΄Π½ΠΎ Ρ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈ Π½Π° Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ, Π·Π° Π΄Π° ΠΏΠΎΡΡΠΈΠ³Π½Π΅ΠΌ ΠΆΠ΅Π»Π°Π½ΠΈΡ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ, ΠΊΠ°ΡΠΎ ΡΡΡΠ΅Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°ΠΌΠ΅ ΠΎΠ±ΡΠ°ΡΠ½Π° ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡ.
ΠΠ΅Π»Π΅ΠΆΠΊΠ°ΡΠ°. Π‘ΠΏΠΎΠΌΠ½Π΅ΡΠ΅ ΡΠΈ, ΡΠ΅ ΠΈΠΌΠ°ΠΌΠ΅ Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ Ρ Π²Π΅ΡΡΠΈΠΈ
v1
. Π‘ΡΠ΄ΡΡΠΆΠ° ΠΊΠΎΠ»ΠΎΠ½ΠΈfirst_name
ΠΈlast_name
. Π’ΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΠΌlast_name
Π½Π°surname
. ΠΠΌΠ°ΠΌΠ΅ ΠΈ Π²Π΅ΡΡΠΈΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ1.0.0,
ΠΊΠΎΠΉΡΠΎ Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°surname
.
Π‘ΡΡΠΏΠΊΠ° 2: ΠΠΎΠ±Π°Π²Π΅ΡΠ΅ ΡΠ°ΠΌΠΈΠ»ΠΈΡ
ΠΠ΅ΡΡΠΈΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ: 2.0.0
DB Π²Π΅ΡΡΠΈΡ: v2
ΠΠΎΠΌΠ΅Π½ΡΠ°Ρ
Π§ΡΠ΅Π· Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° Π½ΠΎΠ²Π° ΠΊΠΎΠ»ΠΎΠ½Π° ΠΈ ΠΊΠΎΠΏΠΈΡΠ°Π½Π΅ Π½Π° Π½Π΅ΠΉΠ½ΠΎΡΠΎ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅, Π½ΠΈΠ΅ ΡΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ. Π ΡΡΡΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅, Π°ΠΊΠΎ Π²ΡΡΠ½Π΅ΠΌ JAR Π½Π°Π·Π°Π΄ ΠΈΠ»ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΡΡΠ°Ρ JAR, ΡΠΎΠΉ Π½ΡΠΌΠ° Π΄Π° ΡΠ΅ ΠΏΠΎΠ²ΡΠ΅Π΄ΠΈ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅.
ΠΡΡΠΊΠ°ΠΌΠ΅ Π½ΠΎΠ²Π° Π²Π΅ΡΡΠΈΡ
ΡΡΡΠΏΠΊΠΈ:
- ΠΈΠ·Π²ΡΡΡΠ΅ΡΠ΅ ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ, Π·Π° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ Π½ΠΎΠ²Π° ΠΊΠΎΠ»ΠΎΠ½Π°
surname
. Π‘Π΅Π³Π° Π²Π°ΡΠ°ΡΠ° DB Π²Π΅ΡΡΠΈΡv2
- ΠΊΠΎΠΏΠΈΡΠ°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ
last_name
Π²surname
. ΠΠΎΠ»Ρ, ΠΎΠ±ΡΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ΡΠ΅ Π°ΠΊΠΎ ΠΈΠΌΠ°ΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡ ΡΠ΅Π·ΠΈ Π΄Π°Π½Π½ΠΈ, ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΠΌΠΈΡΠ»ΠΈΡΠ΅ Π·Π° ΠΏΠ°ΠΊΠ΅ΡΠ½Π° ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ! - Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΠΊΠΎΠ΄Π°, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π ΠΠΠΠ’Π ΠΈ Π½ΠΎΠ²Π ΡΡΠ°ΡΠ°ΡΠ° ΠΊΠΎΠ»ΠΎΠ½Π°. Π‘Π΅Π³Π° Π²Π°ΡΠ°ΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ
2.0.0
- ΠΏΡΠΎΡΠ΅ΡΠ΅ΡΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° ΠΎΡ ΠΊΠΎΠ»ΠΎΠ½Π°ΡΠ°
surname
, Π°ΠΊΠΎ Π½Π΅ Π΅null
, ΠΈΠ»ΠΈ ΠΎΡ Π»ast_name
, Π°ΠΊΠΎsurname
Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΡΡΠΈΠ΅ΡΠ΅getLastName()
ΠΎΡ ΠΊΠΎΠ΄Π°, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ΅ ΠΈΠ·Π²Π΅Π΄Π΅null
ΠΊΠΎΠ³Π°ΡΠΎ Π²ΡΡΡΠ°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΠΈ ΠΎΡ3.0.0
Π΄ΠΎ2.0.0
.
ΠΠΊΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Spring Boot Flyway, ΡΠ΅Π·ΠΈ Π΄Π²Π΅ ΡΡΡΠΏΠΊΠΈ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Π²Π΅ΡΡΠΈΡΡΠ° 2.0.0
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠΊΠΎ ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ° Π·Π° Π²Π΅ΡΡΠΈΡ Π½Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ ΡΡΡΠ½ΠΎ, ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ Π΄Π²Π΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π½Π΅ΡΠ°, Π·Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠΎΠ²Π° (ΠΏΡΡΠ²ΠΎ Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°ΠΉΡΠ΅ ΡΡΡΠ½ΠΎ Π²Π΅ΡΡΠΈΡΡΠ° Π½Π° db ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π²Π½Π΅Π΄ΡΠΈΡΠ΅ Π½ΠΎΠ²ΠΎΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅).
Π’ΠΎΠ²Π° Π΅ Π²Π°ΠΆΠ½ΠΎ. ΠΠ΅ Π·Π°Π±ΡΠ°Π²ΡΠΉΡΠ΅, ΡΠ΅ Π½ΠΎΠ²ΠΎΡΡΠ·Π΄Π°Π΄Π΅Π½Π°ΡΠ° ΠΊΠΎΠ»ΠΎΠ½Π° ΠΠ Π’Π Π―ΠΠΠ Π±ΡΠ΄Π΅ ΠΠ Π ΠΠ£ΠΠΠ. ΠΠΊΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ Π²ΡΡΡΠ°Π½Π΅ Π½Π°Π·Π°Π΄, ΡΡΠ°ΡΠΎΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ Π·Π½Π°Π΅ Π·Π° Π½ΠΎΠ²Π°ΡΠ° ΠΊΠΎΠ»ΠΎΠ½Π° ΠΈ Π½ΡΠΌΠ° Π΄Π° Π³ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ° ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅
Insert.
ΠΠΎ Π°ΠΊΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ ΡΠΎΠ²Π° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΠΈ Π²Π°ΡΠΈΡΡ db ΡΠ΅ Π±ΡΠ΄Π΅v2
, ΡΠΎΠ²Π° ΡΠ΅ ΠΈΠ·ΠΈΡΠΊΠ²Π° Π·Π°Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Π½Π° Π½ΠΎΠ²Π°ΡΠ° ΠΊΠΎΠ»ΠΎΠ½Π°. ΠΠΎΠ΅ΡΠΎ ΡΠ΅ Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ Π½Π°ΡΡΡΠ°Π²Π°Π½Π΅ Π½Π° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡΡΠ°.Π’ΠΎΠ²Π° Π΅ Π²Π°ΠΆΠ½ΠΎ. Π’ΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠ΅ΠΌΠ°Ρ Π½Π΅ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π°
getLastName()
, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π²ΡΠ² Π²Π΅ΡΡΠΈΡΡΠ°3.0.0
Π ΠΊΠΎΠ΄Π° Π½ΡΠΌΠ° ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ Π·Π° ΠΊΠΎΠ»ΠΎΠ½Π°last_name
. Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ ΡΠ°ΠΌ ΡΠ΅ Π±ΡΠ΄Π΅ Π·Π°Π΄Π°Π΄Π΅Π½Π° Π½ΡΠ»Π°. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΎΡΡΠ°Π²ΠΈΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΈ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π·Π°null
, Π½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π±ΠΈ Π±ΠΈΠ»ΠΎ Π΄Π° ΡΠ΅ ΡΠ²Π΅ΡΠΈΡΠ΅, ΡΠ΅ Π² Π»ΠΎΠ³ΠΈΠΊΠ°ΡΠ°getSurname()
ΡΡΠ΅ ΠΈΠ·Π±ΡΠ°Π»ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π½Π°ΡΠ° Π½Π΅Π½ΡΠ»Π΅Π²Π° ΡΡΠΎΠΉΠ½ΠΎΡΡ.
A/B ΡΠ΅ΡΡΠ²Π°Π½Π΅
Π’Π΅ΠΊΡΡΠ°ΡΠ° ΡΠΈΡΡΠ°ΡΠΈΡ Π΅, ΡΠ΅ ΠΈΠΌΠ°ΠΌΠ΅ Π²Π΅ΡΡΠΈΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ 1.0.0
, ΡΠ°Π·Π³ΡΡΠ½Π°ΡΠΈ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎΡΠΎ ΠΈ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ Π² v1
. Π’ΡΡΠ±Π²Π° Π΄Π° Π²Π½Π΅Π΄ΡΠΈΠΌ Π²ΡΠΎΡΠΎ ΠΊΠΎΠΏΠΈΠ΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π·Π° Π²Π΅ΡΡΠΈΡ 2.0.0
ΠΊΠΎΠΉΡΠΎ ΡΠ΅ Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ Π΄ΠΎ v2
.
ΡΡΡΠΏΠΊΠΈ:
- Π΅ Π²Π½Π΅Π΄ΡΠ΅Π½ Π½ΠΎΠ² Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π·Π° Π²Π΅ΡΡΠΈΡ
2.0.0
ΠΊΠΎΠΉΡΠΎ Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ Π΄ΠΎv2
- ΠΌΠ΅ΠΆΠ΄ΡΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π½ΡΠΊΠΎΠΈ Π·Π°ΡΠ²ΠΊΠΈ Π±ΡΡ
Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠ΅Π½ΠΈ ΠΎΡ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΈ Π½Π° Π²Π΅ΡΡΠΈΡ
1.0.0
- Π°ΠΊΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° Π±Π΅ΡΠ΅ ΡΡΠΏΠ΅ΡΠ½Π° ΠΈ ΠΈΠΌΠ°ΡΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΠ°Π±ΠΎΡΠ΅ΡΠΈ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΈ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π·Π° Π²Π΅ΡΡΠΈΡ
1.0.0
ΠΈ Π΄ΡΡΠ³ΠΈ Π²Π΅ΡΡΠΈΠΈ2.0.0.
ΠΡΠ΅ΠΊΠΈ ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠΈΡΠ° Ρ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ Π²v2
- Π²Π΅ΡΡΠΈΡ
1.0.0
Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠΎΠ»ΠΎΠ½Π°ΡΠ° Π·Π° ΡΠ°ΠΌΠΈΠ»ΠΈΡ Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ, Π° Π²Π΅ΡΡΠΈΡΡΠ°2.0.0
ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°. Π’Π΅ Π½Π΅ ΡΠΈ ΠΏΡΠ΅ΡΠ°Ρ ΠΈ Π½Π΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠΌΠ° Π³ΡΠ΅ΡΠΊΠΈ. - Π²Π΅ΡΡΠΈΡ
2.0.0
ΡΡΡ ΡΠ°Π½ΡΠ²Π° Π΄Π°Π½Π½ΠΈ ΠΊΠ°ΠΊΡΠΎ Π² ΡΡΠ°ΡΠ°ΡΠ°, ΡΠ°ΠΊΠ° ΠΈ Π² Π½ΠΎΠ²Π°ΡΠ° ΠΊΠΎΠ»ΠΎΠ½Π°, ΠΎΡΠΈΠ³ΡΡΡΠ²Π°ΠΉΠΊΠΈ ΠΎΠ±ΡΠ°ΡΠ½Π° ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡ
Π’ΠΎΠ²Π° Π΅ Π²Π°ΠΆΠ½ΠΎ. ΠΠΊΠΎ ΠΈΠΌΠ°ΡΠ΅ Π½ΡΠΊΠ°ΠΊΠ²ΠΈ Π·Π°ΡΠ²ΠΊΠΈ, ΠΊΠΎΠΈΡΠΎ Π±ΡΠΎΡΡ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ ΠΎΡ ΡΡΠ°ΡΠ°ΡΠ°/Π½ΠΎΠ²Π°ΡΠ° ΠΊΠΎΠ»ΠΎΠ½Π°, ΡΡΡΠ±Π²Π° Π΄Π° Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡΠ΅, ΡΠ΅ ΡΠ΅Π³Π° ΠΈΠΌΠ°ΡΠ΅ Π΄ΡΠ±Π»ΠΈΡΠ°ΡΠΈ ΡΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ (Π½Π°ΠΉ-Π²Π΅ΡΠΎΡΡΠ½ΠΎ ΡΠ΅ Π²ΡΠ΅ ΠΎΡΠ΅ ΠΌΠΈΠ³ΡΠΈΡΠ°Ρ). ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π°ΠΊΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° ΠΏΡΠ΅Π±ΡΠΎΠΈΡΠ΅ Π±ΡΠΎΡ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅, ΡΠΈΠ΅ΡΠΎ ΡΠ°ΠΌΠΈΠ»Π½ΠΎ ΠΈΠΌΠ΅ (ΠΊΠ°ΠΊΡΠΎ ΠΈ Π΄Π° ΡΠ΅ Π½Π°ΡΠΈΡΠ° ΠΊΠΎΠ»ΠΎΠ½Π°ΡΠ°) Π·Π°ΠΏΠΎΡΠ²Π° Ρ Π±ΡΠΊΠ²Π°ΡΠ°
A
, ΡΠ»Π΅Π΄ ΠΊΠΎΠ΅ΡΠΎ Π΄ΠΎΠΊΠ°ΡΠΎ ΠΌΠΈΠ³ΡΠ°ΡΠΈΡΡΠ° Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΏΡΠΈΠΊΠ»ΡΡΠΈ (old
βnew
ΠΊΠΎΠ»ΠΎΠ½Π°) ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ°ΡΠ΅ Π½Π΅ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΈ Π΄Π°Π½Π½ΠΈ, Π°ΠΊΠΎ Π·Π°ΡΠ²ΠΈΡΠ΅ Π½ΠΎΠ²Π° ΠΊΠΎΠ»ΠΎΠ½Π°.
ΠΡΡΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ
Π‘Π΅Π³Π° ΠΈΠΌΠ°ΠΌΠ΅ Π²Π΅ΡΡΠΈΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ 2.0.0
ΠΈ Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ Π² v2
.
ΡΡΡΠΏΠΊΠΈ:
- Π²ΡΡΠ½Π΅ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΠΈ Π΄ΠΎ Π²Π΅ΡΡΠΈΡ
1.0.0
. - Π²Π΅ΡΡΠΈΡ
1.0.0
Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠΎΠ»ΠΎΠ½Π° Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈsurname
, ΡΠ°ΠΊΠ° ΡΠ΅ Π²ΡΡΡΠ°Π½Π΅ΡΠΎ Π½Π°Π·Π°Π΄ ΡΡΡΠ±Π²Π° Π΄Π° Π΅ ΡΡΠΏΠ΅ΡΠ½ΠΎ
ΠΡΠΎΠΌΠ΅Π½ΠΈ Π² ΠΠ
ΠΠ°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ ΡΡΠ΄ΡΡΠΆΠ° ΠΊΠΎΠ»ΠΎΠ½Π° Ρ ΠΈΠΌΠ΅ 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: ΠΡΠ΅ΠΌΠ°Ρ Π²Π°Π½Π΅ Π½Π° last_name ΠΎΡ ΠΊΠΎΠ΄Π°
ΠΠ΅ΡΡΠΈΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ: 3.0.0
DB Π²Π΅ΡΡΠΈΡ:v3
ΠΠΎΠΌΠ΅Π½ΡΠ°Ρ
ΠΠ°Π±Π΅Π»Π΅ΠΆΠΊΠ° per.: ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ Π² ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½Π°ΡΠ° ΡΡΠ°ΡΠΈΡ Π°Π²ΡΠΎΡΡΡ ΠΏΠΎΠ³ΡΠ΅ΡΠΊΠ° Π΅ ΠΊΠΎΠΏΠΈΡΠ°Π» ΡΠ΅ΠΊΡΡΠ° Π½Π° ΡΠΎΠ·ΠΈ Π±Π»ΠΎΠΊ ΠΎΡ ΡΡΡΠΏΠΊΠ° 2. ΠΠ° ΡΠ°Π·ΠΈ ΡΡΡΠΏΠΊΠ° ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΡΡ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² ΠΊΠΎΠ΄Π° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, Π½Π°ΡΠΎΡΠ΅Π½ΠΈ ΠΊΡΠΌ ΠΏΡΠ΅ΠΌΠ°Ρ
Π²Π°Π½Π΅ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡΡΠ°, ΠΊΠΎΡΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠΎΠ»ΠΎΠ½Π°ΡΠ° last_name
.
Π§ΡΠ΅Π· Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° Π½ΠΎΠ²Π° ΠΊΠΎΠ»ΠΎΠ½Π° ΠΈ ΠΊΠΎΠΏΠΈΡΠ°Π½Π΅ Π½Π° Π½Π΅ΠΉΠ½ΠΎΡΠΎ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ ΡΡΠ·Π΄Π°Π΄ΠΎΡ ΠΌΠ΅ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ°, Π°ΠΊΠΎ Π²ΡΡΠ½Π΅ΠΌ JAR Π½Π°Π·Π°Π΄ ΠΈΠ»ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΡΡΠ°Ρ JAR, ΡΠΎΠΉ Π½ΡΠΌΠ° Π΄Π° ΡΠ΅ ΠΏΠΎΠ²ΡΠ΅Π΄ΠΈ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅.
ΠΡΡΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ
Π ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΠΈΠΌΠ°ΠΌΠ΅ Π²Π΅ΡΡΠΈΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ 3.0.0
ΠΈ Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ v3
. ΠΠ΅ΡΡΠΈΡ 3.0.0
Π½Π΅ Π·Π°ΠΏΠΈΡΠ²Π° Π΄Π°Π½Π½ΠΈ Π² last_name
. Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ Π² surname
ΡΠ΅ ΡΡΡ
ΡΠ°Π½ΡΠ²Π° Π½Π°ΠΉ-Π°ΠΊΡΡΠ°Π»Π½Π°ΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ.
ΡΡΡΠΏΠΊΠΈ:
- Π²ΡΡΠ½Π΅ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΠΈ Π΄ΠΎ Π²Π΅ΡΡΠΈΡ
2.0.0
. - Π²Π΅ΡΡΠΈΡ
2.0.0
ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΈlast_name
ΠΈsurname
. - Π²Π΅ΡΡΠΈΡ
2.0.0
ΡΠ΅ Π²Π·Π΅ΠΌΠ°surname
, Π°ΠΊΠΎ Π½Π΅ Π΅ Π½ΡΠ»Π°, Π² ΠΏΡΠΎΡΠΈΠ²Π΅Π½ ΡΠ»ΡΡΠ°ΠΉ -last_name
ΠΡΠΎΠΌΠ΅Π½ΠΈ Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ
ΠΡΠΌΠ° ΡΡΡΡΠΊΡΡΡΠ½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ. Π‘Π»Π΅Π΄Π½ΠΈΡΡ ΡΠΊΡΠΈΠΏΡ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Π·Π° ΠΈΠ·Π²ΡΡΡΠ²Π°Π½Π΅ Π½Π° ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»Π½Π°ΡΠ° ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ Π½Π° ΡΡΠ°ΡΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ:
-- WE'RE ASSUMING THAT IT'S A FAST MIGRATION - OTHERWISE WE WOULD HAVE TO MIGRATE IN BATCHES
-- ALSO WE'RE NOT CHECKING IF WE'RE NOT OVERRIDING EXISTING ENTRIES. WE WOULD HAVE TO COMPARE
-- ENTRY VERSIONS TO ENSURE THAT IF THERE IS ALREADY AN ENTRY WITH A HIGHER VERSION NUMBER
-- WE WILL NOT OVERRIDE IT.
UPDATE PERSON SET PERSON.surname = PERSON.last_name;
-- DROPPING THE NOT NULL CONSTRAINT; OTHERWISE YOU WILL TRY TO INSERT NULL VALUE OF THE LAST_NAME
-- WITH A NOT_NULL CONSTRAINT.
ALTER TABLE PERSON MODIFY COLUMN last_name varchar(255) NULL DEFAULT NULL;
ΠΡΠΎΠΌΠ΅Π½ΠΈ Π² ΠΊΠΎΠ΄Π°
ΠΠ°Π±Π΅Π»Π΅ΠΆΠΊΠ° ΠΏΠ΅Ρ.: ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠΎΠ·ΠΈ Π±Π»ΠΎΠΊ ΡΡΡΠΎ Π±Π΅ΡΠ΅ ΠΏΠΎΠ³ΡΠ΅ΡΠ½ΠΎ ΠΊΠΎΠΏΠΈΡΠ°Π½ΠΎ ΠΎΡ Π°Π²ΡΠΎΡΠ° ΠΎΡ ΡΡΡΠΏΠΊΠ° 2. Π ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ Ρ Π»ΠΎΠ³ΠΈΠΊΠ°ΡΠ° Π½Π° ΡΡΠ°ΡΠΈΡΡΠ° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π² ΠΊΠΎΠ΄Π° Π½Π° ΡΠ°Π·ΠΈ ΡΡΡΠΏΠΊΠ° ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ° Π½Π°ΡΠΎΡΠ΅Π½ΠΈ ΠΊΡΠΌ ΠΏΡΠ΅ΠΌΠ°Ρ
Π²Π°Π½Π΅ ΠΎΡ Π½Π΅Π³ΠΎ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ°Π±ΠΎΡΡΡ Ρ ΠΊΠΎΠ»ΠΎΠ½Π°ΡΠ° last_name
.
ΠΠΈΠ΅ ΡΡΡ
ΡΠ°Π½ΡΠ²Π°ΠΌΠ΅ Π΄Π°Π½Π½ΠΈ ΠΊΠ°ΡΠΎ last_name
, ΠΈ Π² surname.
ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° ΡΠ΅ΡΠ΅ΠΌ ΠΎΡ ΠΊΠΎΠ»ΠΎΠ½Π°ΡΠ° last_name
, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π΅ Π½Π°ΠΉ-Π°ΠΊΡΡΠ°Π»Π΅Π½. ΠΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½ΡΠΊΠΎΠΈ Π·Π°ΡΠ²ΠΊΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ΅Π½ΠΈ ΠΎΡ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ, ΠΊΠΎΠΉΡΠΎ Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π΅ Π΅ Π½Π°Π΄ΡΡΡΠΎΠ΅Π½.
/*
* Copyright 2012-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package sample.flyway;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Person {
@Id
@GeneratedValue
private Long id;
private String firstName;
private String surname;
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getSurname() {
return this.surname;
}
public void setSurname(String lastname) {
this.surname = lastname;
}
@Override
public String toString() {
return "Person [firstName=" + this.firstName + ", surname=" + this.surname
+ "]";
}
}
Π‘ΡΡΠΏΠΊΠ° 4: ΠΡΠ΅ΠΌΠ°Ρ Π²Π°Π½Π΅ Π½Π° last_name ΠΎΡ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ
ΠΠ΅ΡΡΠΈΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ: 4.0.0
DB Π²Π΅ΡΡΠΈΡ: v4
ΠΠΎΠΌΠ΅Π½ΡΠ°Ρ
ΠΠΎΡΠ°Π΄ΠΈ ΡΠ°ΠΊΡΠ°, ΡΠ΅ ΠΊΠΎΠ΄ΡΡ Π½Π° Π²Π΅ΡΡΠΈΡΡΠ° 3.0.0
Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠΎΠ»ΠΎΠ½Π°ΡΠ° last_name
, Π½ΡΠΌΠ° Π΄Π° ΡΠ΅ ΡΠ»ΡΡΠΈ Π½ΠΈΡΠΎ Π»ΠΎΡΠΎ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅, Π°ΠΊΠΎ ΡΠ΅ Π²ΡΡΠ½Π΅ΠΌ ΠΊΡΠΌ 3.0.0
ΡΠ»Π΅Π΄ ΠΏΡΠ΅ΠΌΠ°Ρ
Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ»ΠΎΠ½Π° ΠΎΡ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ.
ΠΡΡΠ½Π°Π»ΠΈ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅
We will do it in the following way:
01) Run 1.0.0
02) Wait for the app (1.0.0) to boot
03) Generate a person by calling POST localhost:9991/person to version 1.0.0
04) Run 2.0.0
05) Wait for the app (2.0.0) to boot
06) Generate a person by calling POST localhost:9991/person to version 1.0.0
07) Generate a person by calling POST localhost:9992/person to version 2.0.0
08) Kill app (1.0.0)
09) Run 3.0.0
10) Wait for the app (3.0.0) to boot
11) Generate a person by calling POST localhost:9992/person to version 2.0.0
12) Generate a person by calling POST localhost:9993/person to version 3.0.0
13) Kill app (3.0.0)
14) Run 4.0.0
15) Wait for the app (4.0.0) to boot
16) Generate a person by calling POST localhost:9993/person to version 3.0.0
17) Generate a person by calling POST localhost:9994/person to version 4.0.0
Starting app in version 1.0.0
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:
{"firstName":"52b6e125-4a5c-429b-a47a-ef18bbc639d2","lastName":"52b6e125-4a5c-429b-a47a-ef18bbc639d2"}
Starting app in version 2.0.0
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:
{"firstName":"e41ee756-4fa7-4737-b832-e28827a00deb","lastName":"e41ee756-4fa7-4737-b832-e28827a00deb"}
Generate a person in version 2.0.0
Sending a post to 127.0.0.1:9992/person. This is the response:
{"firstName":"0c1240f5-649a-4bc5-8aa9-cff855f3927f","lastName":"0c1240f5-649a-4bc5-8aa9-cff855f3927f","surname":"0c1240f5-649a-4bc5-8aa9-cff855f3927f"}
Killing app 1.0.0
Starting app in version 3.0.0
Generate a person in version 2.0.0
Sending a post to 127.0.0.1:9992/person. This is the response:
{"firstName":"74d84a9e-5f44-43b8-907c-148c6d26a71b","lastName":"74d84a9e-5f44-43b8-907c-148c6d26a71b","surname":"74d84a9e-5f44-43b8-907c-148c6d26a71b"}
Generate a person in version 3.0.0
Sending a post to 127.0.0.1:9993/person. This is the response:
{"firstName":"c6564dbe-9ab5-40ae-9077-8ae6668d5862","surname":"c6564dbe-9ab5-40ae-9077-8ae6668d5862"}
Killing app 2.0.0
Starting app in version 4.0.0
Generate a person in version 3.0.0
Sending a post to 127.0.0.1:9993/person. This is the response:
{"firstName":"cbe942fc-832e-45e9-a838-0fae25c10a51","surname":"cbe942fc-832e-45e9-a838-0fae25c10a51"}
Generate a person in version 4.0.0
Sending a post to 127.0.0.1:9994/person. This is the response:
{"firstName":"ff6857ce-9c41-413a-863e-358e2719bf88","surname":"ff6857ce-9c41-413a-863e-358e2719bf88"}
ΠΡΠΎΠΌΠ΅Π½ΠΈ Π² ΠΠ
ΠΠ° v3
ΠΏΡΠΎΡΡΠΎ ΠΏΡΠ΅ΠΌΠ°Ρ
Π²Π°ΠΌΠ΅ ΠΊΠΎΠ»ΠΎΠ½Π°ΡΠ° last_name
ΠΈ Π΄ΠΎΠ±Π°Π²Π΅ΡΠ΅ Π»ΠΈΠΏΡΠ²Π°ΡΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ.
-- REMOVE THE COLUMN
ALTER TABLE PERSON DROP last_name;
-- ADD CONSTRAINTS
UPDATE PERSON SET surname='' WHERE surname IS NULL;
ALTER TABLE PERSON ALTER COLUMN surname VARCHAR NOT NULL;
ΠΡΠΎΠΌΠ΅Π½ΠΈ Π² ΠΊΠΎΠ΄Π°
ΠΡΠΌΠ° ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² ΠΊΠΎΠ΄Π°.
ΠΡΠΎΠ΄ΡΠΊΡΠΈΡ
Π£ΡΠΏΠ΅ΡΠ½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠΈΡ ΠΌΠ΅ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π½Π΅ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠ° ΠΏΡΠΎΠΌΡΠ½Π° Π½Π° ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠ»ΠΎΠ½Π°, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΡΠ»Π½ΠΈΡ ΠΌΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΈ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½ΠΈΡ. ΠΠΎ-Π΄ΠΎΠ»Ρ Π΅ ΠΎΠ±ΠΎΠ±ΡΠ΅Π½ΠΎ ΠΈΠ·Π²ΡΡΡΠ΅Π½ΠΈΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ:
- Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° Π²Π΅ΡΡΠΈΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ
1.0.0
Ρv1
ΡΡ Π΅ΠΌΠ° Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ (ΠΈΠΌΠ΅ Π½Π° ΠΊΠΎΠ»ΠΎΠ½Π° =last_name
) - Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° Π²Π΅ΡΡΠΈΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ
2.0.0,
ΠΊΠΎΠΉΡΠΎ ΡΡΡ ΡΠ°Π½ΡΠ²Π° Π΄Π°Π½Π½ΠΈ Π²last_name
ΠΈsurname
. ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΠ΅ΡΠ΅ ΠΎΡlast_name
. ΠΠ°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ Π΅ Π²ΡΠ² Π²Π΅ΡΡΠΈΡv2
ΡΡΠ΄ΡΡΠΆΠ°ΡΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΈ ΠΊΠ°ΡΠΎlast_name
Πsurname. surname
Π΅ ΠΊΠΎΠΏΠΈΠ΅ Π½Π° Π»ast_name
. (ΠΠΠΠΠΠΠΠΠ: Π’Π°Π·ΠΈ ΠΊΠΎΠ»ΠΎΠ½Π° Π½Π΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠΌΠ° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π½Π΅ Π½ΡΠ»Π°) - Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° Π²Π΅ΡΡΠΈΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ
3.0.0
, ΠΊΠΎΠΉΡΠΎ ΡΡΡ ΡΠ°Π½ΡΠ²Π° Π΄Π°Π½Π½ΠΈ ΡΠ°ΠΌΠΎ Π²surname
ΠΈ ΡΠ΅ ΡΠ΅ΡΠ΅ ΠΎΡ ΡΠ°ΠΌΠΈΠ»ΠΈΡΡΠ°. Π©ΠΎ ΡΠ΅ ΠΎΡΠ½Π°ΡΡ Π΄ΠΎ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ, ΠΏΠΎΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π°last_name
Π²surname
. Π‘ΡΡΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΠΠ Π ΠΠ£ΠΠΠ ΠΏΡΠ΅ΠΌΠ°Ρ Π½Π°Ρ ΠΎΡlast_name
. ΠΠ°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ Π²Π΅ΡΠ΅ Π΅ Π²ΡΠ² Π²Π΅ΡΡΠΈΡv3
- Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° Π²Π΅ΡΡΠΈΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ
4.0.0
- Π½Π΅ ΡΠ΅ ΠΏΡΠ°Π²ΡΡ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² ΠΊΠΎΠ΄Π°. Π Π°Π·Π³ΡΡΡΠ°Π½Π΅ Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈv4
, ΠΊΠΎΠΉΡΠΎ ΠΏΡΠ΅ΠΌΠ°Ρ Π²Π°last_name
. Π’ΡΠΊ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ Π²ΡΠΈΡΠΊΠΈ Π»ΠΈΠΏΡΠ²Π°ΡΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΊΡΠΌ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ.
ΠΠ°ΡΠΎ ΡΠ»Π΅Π΄Π²Π°ΡΠ΅ ΡΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄, Π²ΠΈΠ½Π°Π³ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΡΡΠ½Π΅ΡΠ΅ Π΅Π΄Π½Π° Π²Π΅ΡΡΠΈΡ Π½Π°Π·Π°Π΄, Π±Π΅Π· Π΄Π° Π½Π°ΡΡΡΠ°Π²Π°ΡΠ΅ ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡΠ° Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ/ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
ΠΠΎΠ΄
Π¦Π΅Π»ΠΈΡΡ ΠΊΠΎΠ΄, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ Π² ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ, Π΅ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π°
ΠΏΡΠΎΠ΅ΠΊΡΠΈ
Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ ΠΊΠ»ΠΎΠ½ΠΈΡΠ°ΡΠ΅ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ, ΡΠ΅ Π²ΠΈΠ΄ΠΈΡΠ΅ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΡΡΡΡΠΊΡΡΡΠ° Π½Π° ΠΏΠ°ΠΏΠΊΠΈΡΠ΅.
βββ boot-flyway-v1 - 1.0.0 version of the app with v1 of the schema
βββ boot-flyway-v2 - 2.0.0 version of the app with v2 of the schema (backward-compatible - app can be rolled back)
βββ boot-flyway-v2-bad - 2.0.0.BAD version of the app with v2bad of the schema (backward-incompatible - app cannot be rolled back)
βββ boot-flyway-v3 - 3.0.0 version of the app with v3 of the schema (app can be rolled back)
βββ boot-flyway-v4 - 4.0.0 version of the app with v4 of the schema (app can be rolled back)
Scripts
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ΡΠ΅, ΠΎΠΏΠΈΡΠ°Π½ΠΈ Π² ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ΡΠ΅ ΠΏΠΎ-Π΄ΠΎΠ»Ρ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠ°Ρ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΈ ΠΈ Π½Π΅ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ.
ΠΠ° Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΡΠ»ΡΡΠ°ΡΡ Ρ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ, ΡΡΠ°ΡΡΠΈΡΠ°ΠΉΡΠ΅:
./scripts/scenario_backward_compatible.sh
Π Π΄Π° Π²ΠΈΠ΄Ρ ΡΠ»ΡΡΠ°ΠΉ Ρ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π½Π΅ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ, ΡΡΠ°ΡΡΠΈΡΠ°ΠΉΡΠ΅:
./scripts/scenario_backward_incompatible.sh
ΠΡΠΈΠΌΠ΅ΡΠ΅Π½ Flyway Π·Π° ΠΏΡΠΎΠ»Π΅ΡΠ½ΠΎ Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅
ΠΡΠΈΡΠΊΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ ΡΠ° Π²Π·Π΅ΡΠΈ ΠΎΡ Spring Boot Sample Flyway.
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΡΠ΅ http://localhost:8080/flyway
, ΠΈΠΌΠ° ΡΠΏΠΈΡΡΠΊ ΡΡΡ ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅.
Π’ΠΎΠ·ΠΈ ΠΏΡΠΈΠΌΠ΅Ρ Π²ΠΊΠ»ΡΡΠ²Π° ΠΈ ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ° H2 (Π² http://localhost:8080/h2-console
), ΡΠ°ΠΊΠ° ΡΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ΡΠΎ Π½Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ (URL Π°Π΄ΡΠ΅ΡΡΡ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ Π½Π° jdbc Π΅ jdbc:h2:mem:testdb
).
ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°
ΠΡΠΎΡΠ΅ΡΠ΅ΡΠ΅ ΠΈ Π΄ΡΡΠ³ΠΈ ΡΡΠ°ΡΠΈΠΈ Π² Π½Π°ΡΠΈΡ Π±Π»ΠΎΠ³:
Kubernetes: Π·Π°ΡΠΎ Π΅ ΡΠΎΠ»ΠΊΠΎΠ²Π° Π²Π°ΠΆΠ½ΠΎ Π΄Π° Π½Π°ΡΡΡΠΎΠΈΡΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡΠ΅ ΡΠ΅ΡΡΡΡΠΈ? Tekton Pipeline - ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈ ΡΡΡΠ±ΠΎΠΏΡΠΎΠ²ΠΎΠ΄ΠΈ Π½Π° Kubernetes ΠΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΈ ΠΌΠΎΠ΄ΡΠ»ΠΈ Π·Π° Nginx ΠΡΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π·Π° Kubernetes Π½Π° Hashicorp Consul ΠΠΎ ΠΊΠ°ΠΊΠ²ΠΎ Π΄ΠΎΠ²Π΅Π΄Π΅ ΠΌΠΈΠ³ΡΠ°ΡΠΈΡΡΠ° ΠΎΡ ClickHouse Π±Π΅Π· Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ ΠΊΡΠΌ ClickHouse Ρ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ? Π‘ΠΈΠ½ΡΠΎ-Π·Π΅Π»Π΅Π½ΠΎ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° Spring ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Ρ ΡΠ΅Π± ΡΡΡΠ²ΡΡ Nginx
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com