
рдпрд╣ рдЖрд▓реЗрдЦ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рддреИрдирд╛рддреА рдХреЗ рджреМрд░рд╛рди рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рдВрдЧрддрддрд╛ рд╕реЗ рдЬреБрдбрд╝реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╣рдо рдЖрдкрдХреЛ рдмрддрд╛рдПрдВрдЧреЗ рдХрд┐ рдпрджрд┐ рдЖрдк рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рддреИрдпрд╛рд░реА рдХреЗ рддреИрдирд╛рддреА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдкрд░ рдХреНрдпрд╛ рдЕрд╕рд░ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИред рдлрд┐рд░ рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЬреАрд╡рди рдЪрдХреНрд░ рдХреЗ рдЪрд░рдгреЛрдВ рд╕реЗ рдЧреБрдЬрд░реЗрдВрдЧреЗ, рдЬреЛ рд╢реВрдиреНрдп рдбрд╛рдЙрдирдЯрд╛рдЗрдо ( рд▓рдЧрднрдЧред рдЯреНрд░рд╛рдВрд╕рд▓реЗрд╢рдиред рдЖрдЧреЗ: - рд╢реВрдиреНрдп рдбрд╛рдЙрдирдЯрд╛рдЗрдо ) рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред рд╣рдорд╛рд░реЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдПрдХ рдкрд┐рдЫрдбрд╝реЗ рд╕рдВрдЧрдд рддрд░реАрдХреЗ рд╕реЗ рдПрдХ рдкрд┐рдЫрдбрд╝реЗ рдЕрд╕рдВрдЧрдд рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реЛрдЧрд╛ред
рдпрджрд┐ рдЖрдк рд▓реЗрдЦ рд╕реЗ рдХреЛрдб рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЙрдиреНрд╣реЗрдВ GitHub рдкрд░ рдкрд╛рдПрдВрдЧреЗред
рдкрд░рд┐рдЪрдп
рд╢реВрдиреНрдп рдбрд╛рдЙрдирдЯрд╛рдЗрдо рдкрд░рд┐рдирд┐рдпреЛрдЬрди
рд░рд╣рд╕реНрдпрдордп рд╢реВрдиреНрдп рдбрд╛рдЙрдирдЯрд╛рдЗрдо рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХреНрдпрд╛ рд╣реИ? рд╣рдо рдпрд╣ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЬрдм рдЖрдкрдХрд╛ рдЖрд╡реЗрджрди рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреЗрд╢ рдХрд░ рд╕рдХреЗрдВ, рдЬрдмрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЗрд╕рдХреА рджреБрд░реНрдЧрдорддрд╛ рдХрд╛ рдзреНрдпрд╛рди рдирд╣реАрдВ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рдХрдВрдкрдиреА рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдВрднрд╡ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдкрд░рд┐рджреГрд╢реНрдп рд╣реИ, рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЖрдк рдирдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреЗрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд░реБрдХрд╛рд╡рдЯ рдХреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕реЗ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдП? рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ:
- рдЕрдкрдиреА рд╕реЗрд╡рд╛ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг 1 рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВ
- рдбреЗрдЯрд╛рдмреЗрд╕ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░реЗрдВ
- рд╕рдВрд╕реНрдХрд░рдг 1 рдХреЗ рд╕рд╛рде рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдЕрдкрдиреА рд╕реЗрд╡рд╛ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг 2 рдХреЛ рддреИрдирд╛рдд рдХрд░реЗрдВ
- рдЬреИрд╕реЗ рд╣реА рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ 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 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдХреИрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдФрд░ рдлреНрд▓рд╛рдИрд╡реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдбреЙрдХреНрд╕ рджреЗрдЦреЗрдВ ред
рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдХреЗ рд╕рд╛рде рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдкрдХреЛ 2 рдмреЗрд╣рддрд░реАрди рд▓рд╛рдн рдорд┐рд▓рддреЗ рд╣реИрдВ:
- рдЖрдк рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдЕрд▓рдЧ рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди
- рдбреЗрдЯрд╛рдмреЗрд╕ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд░реЛрд▓рдЖрдЙрдЯ рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдЖрдкрдХреА рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рд░рд▓ рд╣реИ
рдбреЗрдЯрд╛рдмреЗрд╕ рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛
рд▓реЗрдЦ рдХреЗ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рджреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред
- рдкрд┐рдЫрдбрд╝реА рдЕрд╕рдВрдЧрддрд┐
- рдкрд┐рдЫрдбрд╝реА рд╕рдВрдЧрддрддрд╛
рдкрд╣рд▓реЗ рдХреЛ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдЖрдкрдХреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рддреИрдпрд╛рд░реА рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╢реВрдиреНрдп рдбрд╛рдЙрдирдЯрд╛рдЗрдо рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ... рджреВрд╕рд░рд╛ рдпрд╣ рд╕рдорд╛рдзрд╛рди рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдбрд╛рдЙрдирдЯрд╛рдЗрдо рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдкрд┐рдЫрдбрд╝реЗ рд╕рдВрдЧрддрддрд╛ рдмрдирд╛рдП рд░рдЦреЗрдВред
рд╣рдорд╛рд░рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ, рдЬрд┐рд╕ рдкрд░ рд╣рдо рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдлреНрд▓рд╛рдИрд╡реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкрд╣рд▓реЗ_ irst_name
рдФрд░ irst_name
рдПрдХ Person
рд╣реИ ( рд▓рдЧрднрдЧред Person
: рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд╣реИ, рдФрд░ f irst_name
рдФрд░ irst_name
рдЗрд╕рдореЗрдВ рдлрд╝реАрд▓реНрдб рд╣реИрдВ )ред рд╣рдо surname
рд▓рд┐рдП last_name
рдХрд╛ рдирд╛рдо рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдорд╛рдиреНрдпрддрд╛рдУрдВ
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рд╡рд┐рд╡рд░рдг рдореЗрдВ рддрд▓реНрд▓реАрди рд╣реЛрдВ, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдорд╛рдиреНрдпрддрд╛рдУрдВ рдХреА рд░реВрдкрд░реЗрдЦрд╛ рддреИрдпрд╛рд░ рдХрд░рдиреА рд╣реЛрдЧреАред рдореБрдЦреНрдп рдкрд░рд┐рдгрд╛рдо рдЬрд┐рд╕реЗ рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╣ рдПрдХ рдХрд╛рдлреА рд╕рд░рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реЛрдЧреАред
рдиреЛрдЯред рдмрд┐рдЬрдиреЗрд╕ рдкреНрд░реЛ-рдЯреАрдЖрдИрдкреАред рд╕реНрдЯреНрд░реАрдорд▓рд╛рдЗрдирд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрдкрдХреЛ рд╕рдорд░реНрдерди рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреИрд╕реЗ рдмрдЪрд╛ рд╕рдХрддреА рд╣реИ (рдЖрдкрдХреА рдХрдВрдкрдиреА рдореЗрдВ рдЬрд┐рддрдиреЗ рдЕрдзрд┐рдХ рд▓реЛрдЧ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЙрддрдиреЗ рдЕрдзрд┐рдХ рдкреИрд╕реЗ рдЖрдк рдмрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВ)!
рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рд╡рд╛рдкрд╕ рд░реЛрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ
рдпрд╣ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИ (рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдХреБрдЫ рд░реЛрд▓рдмреИрдХ рд▓рдЧрднрдЧ рдЕрд╕рдВрднрд╡ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░реЛрд▓рдмреИрдХ рд╡рд┐рд▓реЛрдкрди)ред рд╣рдо рдХреЗрд╡рд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд╛рдкрд╕ рд▓реЗрдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣, рднрд▓реЗ рд╣реА рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбреЗрдЯрд╛рдмреЗрд╕ рд╣реЛрдВ (рдЬреИрд╕реЗ рдХрд┐ SQL рдФрд░ NoSQL), рдЖрдкрдХреА рддреИрдирд╛рддреА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕рдорд╛рди рджрд┐рдЦреЗрдЧреАред
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рд╡рд╛рдкрд╕ рд░реЛрд▓ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ (рдЕрдзрд┐рдХ рдирд╣реАрдВ)
рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдкрд░ рд╣реА рд░реЛрд▓рдмреИрдХ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реИ рдЬрд┐рд╕реЗ рдареАрдХ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдирд╡реАрдирддрдо рдХрд╛рд░реНрдпрд╢реАрд▓ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдирд╡реАрдирддрдо рдХрд╛рд░реНрдп рд╕рдВрд╕реНрдХрд░рдг рдкрд┐рдЫрд▓реЗ рдПрдХ рд╣реИред рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд░реЛрд▓рдЖрдЙрдЯ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рдВрдЧрддрддрд╛ рдмрдирд╛рдП рд░рдЦрдирд╛ рдмреЗрд╣рдж рдореБрд╢реНрдХрд┐рд▓ рдФрд░ рдорд╣рдВрдЧрд╛ рд╣реЛрдЧрд╛ред
рдиреЛрдЯред рдЕрдзрд┐рдХ рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рд╣рдо рдЖрд╡реЗрджрди рдХреЗ рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдмрджрд▓ рджреЗрдВрдЧреЗред
рдЪрд░рдг 1: рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЕрд╡рд╕реНрдерд╛
рдЖрд╡реЗрджрди рд╕рдВрд╕реНрдХрд░рдг: 1.0.0
DB рд╕рдВрд╕реНрдХрд░рдг: v1
рдЯрд┐рдкреНрдкрдгреА
рдпрд╣ рдЖрд╡реЗрджрди рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐ рд╣реЛрдЧреАред
DB рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ
рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ last_name.
рд╢рд╛рдорд┐рд▓ рд╣реИ 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
рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдирд╛ v2bad
ред
рдХрджрдо:
- рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдВрд╕реНрдХрд░рдг
2.0.0.BAD
рдХрд╛ рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рддреИрдирд╛рдд рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ v2bad
рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИ v2bad
рдХреЙрд▓рдо рдЕрдм v2bad
рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ - рдЗрд╕реЗ surname
рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛- рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрдкрдбреЗрдЯ рд╕рдлрд▓ рд░рд╣реЗ, рдФрд░ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ
1.0.0
, 2.0.0.BAD
рдореЗрдВ рдЕрдиреНрдп рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд╕рднреА рд╕рдВрдмрдВрдзрд┐рдд v2bad
- рд╕рдВрд╕реНрдХрд░рдг
1.0.0
рд╕рднреА рдЙрджрд╛рд╣рд░рдг рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдлреЗрдВрдХрдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ last_name
рдХреЙрд▓рдо рдореЗрдВ рдбреЗрдЯрд╛ рдбрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдЕрдм рдирд╣реАрдВ рд╣реИ - рд╕рдВрд╕реНрдХрд░рдг
2.0.0.BAD
рд╕рднреА рдЙрджрд╛рд╣рд░рдг рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдЧрд░ рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдкрд┐рдЫрдбрд╝реЗ рдЕрд╕рдВрдЧрдд рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдП / рдмреА рдкрд░реАрдХреНрд╖рдг рдЕрд╕рдВрднрд╡ рд╣реИред
рд░реЛрд▓рдмреИрдХ рдЖрд╡реЗрджрди
рдорд╛рди рд▓реЗрдВ рдХрд┐ рдП / рдмреА рддреИрдирд╛рддреА ( рд▓рдЧрднрдЧ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж ред рдЕрдиреБрд╡рд╛рджред: рд╢рд╛рдпрдж, рд▓реЗрдЦрдХ рдпрд╣рд╛рдВ рдП / рдмреА рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд░рд╣рд╛ рдерд╛ ), рд╣рдордиреЗ рддрдп рдХрд┐рдпрд╛ рдХрд┐ рд╣рдореЗрдВ рдЖрд╡реЗрджрди рдХреЛ рд╡рд╛рдкрд╕ рд╕рдВрд╕реНрдХрд░рдг 1.0.0.
рд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ 1.0.0.
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рд╡рд╛рдкрд╕ рд░реЛрд▓ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдХрджрдо:
- рд╣рдо рдЖрд╡реЗрджрди рдЙрджрд╛рд╣рд░рдг рд╕рдВрд╕реНрдХрд░рдг
2.0.0.BAD
- рдбреЗрдЯрд╛рдмреЗрд╕ рдЕрднреА рднреА
v2bad
- рд╕рдВрд╕реНрдХрд░рдг
1.0.0
рдмрд╛рдж рд╕реЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ surname
рдХреНрдпрд╛ 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"}
DB рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ
рдорд╛рдЗрдЧреНрд░реЗрд╢рди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛ surname
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 рдХрд╛ рдирд╛рдо рдмрджрд▓ рджреЗрддреА рд╣реИред
-- This change is backward incompatible - you can't do A/B testing ALTER TABLE PERSON CHANGE last_name surname VARCHAR;
рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрди
рд╣рдордиреЗ surname
рдирд╛рдо рдлрд╝реАрд▓реНрдб рдирд╛рдо рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИред
рд╕реНрддрдВрдн рдХрд╛ рдирд╛рдо рдкреАрдЫреЗ рд╕рдВрдЧрдд рддрд░реАрдХреЗ рд╕реЗ рд░рдЦрдирд╛
рдпрд╣ рд╕рдмрд╕реЗ рдЖрдо рд╕реНрдерд┐рддрд┐ рд╣реИ рдЬрд┐рд╕рдХрд╛ рд╣рдо рд╕рд╛рдордирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдкрд┐рдЫрдбрд╝реЗ рдЕрд╕рдВрдЧрдд рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рд╕рд╛рдмрд┐рдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рдбрд╛рдЙрдирдЯрд╛рдЗрдо рдХреЗ рдмрд┐рдирд╛ рдПрдХ рддреИрдирд╛рддреА рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд╕рд┐рд░реНрдл рдбреЗрдЯрд╛рдмреЗрд╕ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдЦ рдХреЗ рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рд╡рд╛рдВрдЫрд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдЖрд╡реЗрджрди рдХреЗ 3 рддреИрдирд╛рддреА рдХрд░реЗрдВрдЧреЗ рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдкрд┐рдЫрдбрд╝реЗ рд╕рдВрдЧрддрддрд╛ рдмрдирд╛рдП рд░рдЦреЗрдВрдЧреЗред
рдиреЛрдЯред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рдВрд╕реНрдХрд░рдг v1
ред рдЗрд╕рдореЗрдВ рдХреЙрд▓рдо first_name
рдФрд░ last_name
ред рд╣рдореЗрдВ surname
рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП last_name
рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдВрд╕реНрдХрд░рдг 1.0.0,
рднреА рд╣реИ рдЬреЛ рдЕрднреА рддрдХ surname
рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдЪрд░рдг 2: рдЙрдкрдирд╛рдо рдЬреЛрдбрд╝реЗрдВ
рдЖрд╡реЗрджрди рд╕рдВрд╕реНрдХрд░рдг: 2.0.0
DB рд╕рдВрд╕реНрдХрд░рдг: v2
рдЯрд┐рдкреНрдкрдгреА
рдПрдХ рдирдпрд╛ рдХреЙрд▓рдо рдЬреЛрдбрд╝рдХрд░ рдФрд░ рдЙрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдХрд░, рд╣рдо рдкрд┐рдЫрдбрд╝реЗ рд╕рдВрдЧрдд рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдмрдирд╛рддреЗ рд╣реИрдВред рдЙрд╕реА рд╕рдордп, рдпрджрд┐ рд╣рдо JAR рдХреЛ рд╡рд╛рдкрд╕ рд▓рд╛рддреЗ рд╣реИрдВ рдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдХрд╛рдордХрд╛рдЬреА рдкреБрд░рд╛рдирд╛ JAR рд╣реИ, рддреЛ рдпрд╣ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдирд╣реАрдВ рдЯреВрдЯреЗрдЧрд╛ред
рд╣рдо рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ
рдХрджрдо:
- рдПрдХ рдирдпрд╛
surname
рдХреЙрд▓рдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░реЗрдВред рдЕрдм рдЖрдкрдХрд╛ db рд╕рдВрд╕реНрдХрд░рдг v2
last_name
рд╕реЗ surname
рдбреЗрдЯрд╛ рдХреЙрдкреА рдХрд░реЗрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдпрд╣ рдбреЗрдЯрд╛ рдмрд╣реБрдд рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдмреИрдЪ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП!- рдХреЛрдб рд▓рд┐рдЦреЗрдВ рдЬрд╣рд╛рдВ BOTH рдирдП рдФрд░ рдкреБрд░рд╛рдиреЗ рджреЛрдиреЛрдВ рдХреЙрд▓рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдм рдЖрдкрдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдВрд╕реНрдХрд░рдг
2.0.0
surname
рдХреЙрд▓рдо рд╕реЗ рдорд╛рди рдкрдврд╝реЗрдВ рдпрджрд┐ рдпрд╣ null
рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдПрд▓ ast_name
рдЕрдЧрд░ surname
рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИред рдЖрдк рдХреЛрдб рд╕реЗ getLastName()
рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ 3.0.0
рд╕реЗ 2.0.0
рддрдХ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╡рд╛рдкрд╕ рд░реЛрд▓ рдХрд░рдиреЗ рдкрд░ null
рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рдпрджрд┐ рдЖрдк рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдлреНрд▓рд╛рдИрд╡реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдпреЗ рджреЛ рдЪрд░рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рдВрд╕реНрдХрд░рдг 2.0.0
рд▓реЙрдиреНрдЪ рдХреЗ рджреМрд░рд╛рди рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдпрджрд┐ рдЖрдк рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╡рд░реНрдЬрдирд┐рдВрдЧ рдЯреВрд▓ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪреАрдЬреЗрдВ рдХрд░рдиреА рд╣реЛрдВрдЧреА (рдкрд╣рд▓реЗ db рд╡рд░реНрдЬрди рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рдПрдХ рдирдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд рдХрд░реЗрдВ)ред
рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдПрдХ рдирдпрд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╕реНрддрдВрдн рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреВрд░рд╛ рди рд╣реЛред рдпрджрд┐ рдЖрдк рд╡рд╛рдкрд╕ рд░реЛрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкреБрд░рд╛рдирд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдирдП рдХреЙрд▓рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ рдФрд░ Insert.
рджреМрд░рд╛рди рдЗрд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ Insert.
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЗрд╕ рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рдЖрдкрдХрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ v2
рд╣реЛрдЧрд╛, рддреЛ рдЙрд╕реЗ рдирдП рдХреЙрд▓рдо рдХрд╛ рдорд╛рди рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЬрд┐рд╕рд╕реЗ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рд╣реЛрдЧрд╛ред
рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЖрдкрдХреЛ getLastName()
рд╡рд┐рдзрд┐ рдХреЛ рд╣рдЯрд╛ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрд╕реНрдХрд░рдг 3.0.0
рдореЗрдВ рдХреЛрдб рдореЗрдВ last_name
рдХреЙрд▓рдо рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдирд▓ рд╡рд╣рд╛рдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдк рд╡рд┐рдзрд┐ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ null
рдЪреЗрдХ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ getSurname()
рддрд░реНрдХ рдореЗрдВ рдЖрдкрдиреЗ рд╕рд╣реА рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рди рдЪреБрдирд╛ рд╣реИред
рдП / рдмреА рдкрд░реАрдХреНрд╖рдг
рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдВрд╕реНрдХрд░рдг 1.0.0
рд╣реИ рдЬреЛ рдареЗрд╕ рдкрд░ рддреИрдирд╛рдд рд╣реИ рдФрд░ v1
рдореЗрдВ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рд╣реИред рд╣рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдВрд╕реНрдХрд░рдг 2.0.0
рдХреЗ рджреВрд╕рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ v2
рдЕрдкрдЧреНрд░реЗрдб рдХрд░реЗрдЧрд╛ред
рдХрджрдо:
- рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рдВрд╕реНрдХрд░рдг
2.0.0
рдХрд╛ рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рддреИрдирд╛рдд рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ v2
рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИ - рдЗрд╕ рдмреАрдЪ, рдХреБрдЫ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕реНрдХрд░рдг
1.0.0
рдЙрджрд╛рд╣рд░рдгреЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдЕрдкрдбреЗрдЯ рд╕рдлрд▓ рд░рд╣рд╛, рдФрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдВрд╕реНрдХрд░рдг
1.0.0
рдФрд░ рд╢реЗрд╖ рд╕рдВрд╕реНрдХрд░рдг 2.0.0.
рдХрдИ рдХрд╛рд░реНрдпрд╢реАрд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ 2.0.0.
рд╣рд░ рдХреЛрдИ v2
рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИ - рд╕рдВрд╕реНрдХрд░рдг
1.0.0
рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЙрдкрдирд╛рдо рдХреЙрд▓рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрд╕реНрдХрд░рдг 2.0.0
рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╡реЗ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред - рд╕рдВрд╕реНрдХрд░рдг
2.0.0
рдкреБрд░рд╛рдиреЗ рдФрд░ рдирдП рджреЛрдиреЛрдВ рдХреЙрд▓рдо рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдкрд┐рдЫрдбрд╝реЗ рд╕рдВрдЧрддрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ
рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдХреЛрдИ рдкреНрд░рд╢реНрди рд╣реИрдВ рдЬреЛ рдкреБрд░рд╛рдиреЗ / рдирдП рдХреЙрд▓рдо рд╕реЗ рдорд╛рдиреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрдЗрдЯрдо рдЧрд┐рдирддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдорд╛рди рд╣реИрдВ (рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рд╡реЗ рдЕрднреА рднреА рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░ рд░рд╣реЗ рд╣реИрдВ)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдЙрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрд┐рдирдХрд╛ рдЕрдВрддрд┐рдо рдирд╛рдо (рд╕реНрддрдВрдн рдХрд╛ рдирд╛рдо рдХреЛрдИ рднреА рд╣реЛ) рдЕрдХреНрд╖рд░ A
рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдбреЗрдЯрд╛ рдорд╛рдЗрдЧреНрд░реЗрд╢рди ( old
тЖТ new
рдХреЙрд▓рдо) рдкреВрд░рд╛ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрд┐рд╕реА рдирдП рдХреЙрд▓рдо рдкрд░ рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреА рд╣реИ, рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрд╕рдВрдЧрдд рдбреЗрдЯрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рд░реЛрд▓рдмреИрдХ рдЖрд╡реЗрджрди
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдВрд╕реНрдХрд░рдг 2.0.0
рдФрд░ v2
рдореЗрдВ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рд╣реИред
рдХрджрдо:
- рд╕рдВрд╕реНрдХрд░рдг
1.0.0
рд▓рд┐рдП рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЛ рд╡рд╛рдкрд╕ рд░реЛрд▓ рдХрд░реЗрдВред - рд╕рдВрд╕реНрдХрд░рдг
1.0.0
рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ surname
рдХреЙрд▓рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд░реЛрд▓рдмреИрдХ рд╕рдлрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
DB рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ
рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ last_name
рдирд╛рдо рдХрд╛ рдПрдХ рдХреЙрд▓рдо рд╣реЛрддрд╛ рд╣реИред
рд╕реНрд░реЛрдд рдлреНрд▓рд╛рдИрд╡реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ:
CREATE TABLE PERSON ( id BIGINT GENERATED BY DEFAULT AS IDENTITY, first_name varchar(255) not null, last_name varchar(255) not null ); insert into PERSON (first_name, last_name) values ('Dave', 'Syer');
surname
рдЬреЛрдбрд╝рдиреЗ рдХреА рд▓рд┐рдкрд┐ред
рдЪреЗрддрд╛рд╡рдиреАред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЖрдк рдЬреЛрдбрд╝реЗ рдЧрдП рдХреЙрд▓рдо рдореЗрдВ рдХреЛрдИ рдкреВрд░реНрдг рдмрд╛рдзрд╛ рдирд╣реАрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк 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
рд╕рдмрд╕реЗ рд╡рд░реНрддрдорд╛рди рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред
рдХрджрдо:
- рд╕рдВрд╕реНрдХрд░рдг
2.0.0
рд▓рд┐рдП рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЛ рд╡рд╛рдкрд╕ рд░реЛрд▓ рдХрд░реЗрдВред - рд╕рдВрд╕реНрдХрд░рдг
2.0.0
last_name
рдФрд░ surname
рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред - рд╕рдВрд╕реНрдХрд░рдг
2.0.0
surname
рд▓реЗрдЧрд╛ рдпрджрд┐ рдпрд╣ рдЕрд╢рдХреНрдд рдирд╣реАрдВ рд╣реИ, рдЕрдиреНрдпрдерд╛ last_name
DB рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ
рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХреЛрдИ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реИрдВред рдирд┐рдореНрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреА рд╣реИ, рдЬреЛ рдкреБрд░рд╛рдиреЗ рдбреЗрдЯрд╛ рдХреЗ рдЕрдВрддрд┐рдо рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреА рд╣реИ:
-- 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.
рджреЛрдиреЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ 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.0.0
v1
рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрдХреАрдорд╛ (рд╕реНрддрдВрдн рдирд╛рдо = last_name
) рдХреЗ рд╕рд╛рде - рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдВрд╕реНрдХрд░рдг
2.0.0,
рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд рдХрд░реЗрдВ 2.0.0,
рдЬреЛ last_name
рдФрд░ surname
рдореЗрдВ рдбреЗрдЯрд╛ рдмрдЪрд╛рддрд╛ рд╣реИред рдЖрд╡реЗрджрди last_name
рд╕реЗ рдкрдврд╝рддрд╛ рд╣реИред рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рдВрд╕реНрдХрд░рдг v2
, рдЬрд┐рд╕рдореЗрдВ last_name
рдФрд░ surname. surname
рджреЛрдиреЛрдВ рдХреЗ рдХреЙрд▓рдо рд╣реИрдВ surname. surname
surname. surname
l ast_name
рдХреА рдПрдХ рдкреНрд░рддрд┐ рд╣реИред (: not null) 3.0.0
, surname
surname. , last_name
surname
. NOT NULL last_name
. v3
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
Spring Boot Sample Flyway
Spring Boot Sample Flyway.
http://localhost:8080/flyway
, .
H2 ( http://localhost:8080/h2-console
), (URL jdbc тАФ jdbc:h2:mem:testdb
).
рдЗрд╕рдХреЗ рд╕рд╛рде рд╣реА
рд╣рдорд╛рд░реЗ рдмреНрд▓реЙрдЧ рдкрд░ рдЕрдиреНрдп рд▓реЗрдЦ рднреА рдкрдврд╝реЗрдВ: