рдпрд╕ рдЖрд▓реЗрдЦрд▓реЗ рд╡рд┐рд╕реНрддрд╛рд░рдорд╛ рдХрд╕рд░реА рдбрд╛рдЯрд╛рдмреЗрд╕ рдЕрдиреБрдХреВрд▓рддрд╛ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рдбрд┐рдкреНрд▓реЛрдпрдореЗрдиреНрдЯрдорд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрдиреЗ рднрдиреЗрд░ рдмрддрд╛рдЙрдБрдЫред рдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдкреНрд░рд╛рд░рдореНрднрд┐рдХ рддрдпрд╛рд░реА рдмрд┐рдирд╛ рдиреИ рдбрд┐рдкреНрд▓реЛрдп рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреБрднрдпреЛ рднрдиреЗ рд╣рд╛рдореА рддрдкрд╛рдИрдВрдХреЛ рдЙрддреНрдкрд╛рджрди рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВрд▓рд╛рдИ рдХреЗ рд╣реБрди рд╕рдХреНрдЫ рднрдиреНрдиреЗ рдХреБрд░рд╛ рдмрддрд╛рдЙрдиреЗрдЫреМрдВред рддреНрдпрд╕рдкрдЫрд┐ рд╣рд╛рдореА рдЖрд╡реЗрджрди рдЬреАрд╡рдирдЪрдХреНрд░ рдЪрд░рдгрд╣рд░реВ рдкрд╛рд░ рдЧрд░реНрдиреЗрдЫреМрдВ рдЬреБрди рд╢реВрдиреНрдп рдбрд╛рдЙрдирдЯрд╛рдЗрдо (рд▓рдЧрднрдЧред рд▓реЗрди: рдердк - рд╢реВрдиреНрдп рдбрд╛рдЙрдирдЯрд╛рдЗрдо)ред рд╣рд╛рдореНрд░реЛ рдЕрдкрд░реЗрд╕рдирдХреЛ рдирддрд┐рдЬрд╛ рдмреНрдпрд╛рдХрд╡рд░реНрдб-рдЕрд╕рдВрдЧрдд рдбрд╛рдЯрд╛рдмреЗрд╕ рдкрд░рд┐рд╡рд░реНрддрдирд▓рд╛рдИ рдмреНрдпрд╛рдХрд╡рд░реНрдб-рдХрдореНрдкреНрдпрд╛рдЯрд┐рдмрд▓ рддрд░рд┐рдХрд╛рд▓реЗ рд▓рд╛рдЧреВ рдЧрд░реНрдиреЗ рд╣реЛред
рдпрджрд┐ рддрдкрд╛рдЗрдБ рд▓реЗрдЦрдмрд╛рдЯ рдХреЛрдб рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рдмреБрдЭреНрди рдЪрд╛рд╣рдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рддрдкрд╛рдЗрдБ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ
рдкрд░рд┐рдЪрдп
рд╢реВрдиреНрдп рдбрд╛рдЙрдирдЯрд╛рдЗрдо рддреИрдирд╛рддреА
рдХрд╕реНрддреЛ рд░рд╣рд╕реНрдпрдордп рд╢реВрдиреНрдп рдбрд╛рдЙрдирдЯрд╛рдЗрдо рддреИрдирд╛рддреА? рддрдкрд╛рдЗрдБ рдпреЛ рднрдиреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдЬрдм рддрдкрд╛рдЗрдБрдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╕рди рдпрд╕реНрддреЛ рддрд░рд┐рдХрд╛рд▓реЗ рдбрд┐рдкреНрд▓реЛрдЗ рдЧрд░рд┐рдПрдХреЛ рдЫ рдХрд┐ рддрдкрд╛рдЗрдБ рдЙрддреНрдкрд╛рджрдирдорд╛ рдПрдкреНрд▓рд┐рдХреЗрд╕рдирдХреЛ рдирдпрд╛рдБ рд╕рдВрд╕реНрдХрд░рдг рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкрд░рд┐рдЪрдп рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдЬрдмрдХрд┐ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд▓реЗ рдпрд╕рдХреЛ рдЕрдиреБрдкрд▓рдмреНрдзрддрд╛рд▓рд╛рдИ рдпрд╛рдж рдЧрд░реНрджреИрдиред рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд░ рдХрдореНрдкрдиреАрдХреЛ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдпрдмрд╛рдЯ, рдпреЛ рдЙрддреНрддрдо рд╕рдореНрднрд╛рд╡рд┐рдд рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдкрд░рд┐рджреГрд╢реНрдп рд╣реЛ рдХрд┐рдирднрдиреЗ рдпрд╕рд▓реЗ рдирдпрд╛рдБ рд╕реБрд╡рд┐рдзрд╛рд╣рд░реВ рдкреНрд░рд╕реНрддреБрдд рдЧрд░реНрди рд░ рдмрдЧрд╣рд░реВ рдмрд┐рдирд╛ рдЕрд╡рд░реЛрдз рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред
рдпреЛ рдХрд╕рд░реА рд╣рд╛рд╕рд┐рд▓ рдЧрд░реНрдиреЗ? рддреНрдпрд╣рд╛рдБ рдзреЗрд░реИ рддрд░рд┐рдХрд╛рд╣рд░реВ рдЫрдиреН, рдпрд╣рд╛рдБ рддрд┐рдиреАрд╣рд░реВрдордзреНрдпреЗ рдПрдЙрдЯрд╛ рд╣реЛ:
- рддрдкрд╛рдЗрдБрдХреЛ рд╕реЗрд╡рд╛рдХреЛ рд╕рдВрд╕реНрдХрд░рдг рдирдореНрдмрд░ 1 рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН
- рдбрд╛рдЯрд╛рдмреЗрд╕ рдорд╛рдЗрдЧреНрд░реЗрд╕рди рдЧрд░реНрдиреБрд╣реЛрд╕реН
- рд╕рдВрд╕реНрдХрд░рдг # 2 рд╕рдБрдЧ рд╕рдорд╛рдирд╛рдиреНрддрд░ рд░реВрдкрдорд╛ рддрдкрд╛рдИрдВрдХреЛ рд╕реЗрд╡рд╛рдХреЛ рд╕рдВрд╕реНрдХрд░рдг # 1 рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН
- рдЬрд╕рд░реА рддрдкрд╛рдИрдВрд▓реЗ рддреНрдпреЛ рд╕рдВрд╕реНрдХрд░рдг рдирдореНрдмрд░ 2 рд▓реЗ рдЬрд╕реНрддреИ рдХрд╛рдо рдЧрд░реЗрдХреЛ рджреЗрдЦреНрдиреБрд╣реБрдиреНрдЫ, рд╕рдВрд╕реНрдХрд░рдг рдирдореНрдмрд░ 1 рд╣рдЯрд╛рдЙрдиреБрд╣реЛрд╕реН
- рддрдпрд╛рд░ рдЫ!
рд╕рдЬрд┐рд▓реЛ, рд╣реИрди? рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, рдпреЛ рддреНрдпрддрд┐ рд╕рд░рд▓ рдЫреИрди, рд░ рд╣рд╛рдореА рдпрд╕рд▓рд╛рдИ рдкрдЫрд┐ рд╡рд┐рд╕реНрддрд╛рд░рдорд╛ рд╣реЗрд░реНрдиреЗрдЫреМрдВред рдЕрдм рд╣рд╛рдореА рдЕрд░реНрдХреЛ рдПрдХрджрдо рд╕рд╛рдорд╛рдиреНрдп рддреИрдирд╛рддреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЬрд╛рдБрдЪ рдЧрд░реМрдВ - рдиреАрд▓реЛ рд╣рд░рд┐рдпреЛ рддреИрдирд╛рддреАред
рдХреЗ рддрдкрд╛рдЗрдБ рдХрд╣рд┐рд▓реНрдпреИ рд╕реБрдиреНрдиреБрднрдПрдХреЛ рдЫ
- рддрдкрд╛рдИрдВрдХреЛ рдЙрддреНрдкрд╛рджрди рдХреЛрдб ("рдиреАрд▓реЛ" рд░ "рд╣рд░рд┐рдпреЛ") рдХреЛ рджреБрдИ рдкреНрд░рддрд┐рд╣рд░реВ рдХрд╛рдо рдЧрд░реЗрдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрдиреБрд╣реЛрд╕реН;
- рд╕рдмреИ рдЯреНрд░рд╛рдлрд┐рдХрд▓рд╛рдИ рдирд┐рд▓реЛ рд╡рд╛рддрд╛рд╡рд░рдгрдорд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдЕрд░реНрдерд╛рддреНред рддрд╛рдХрд┐ рдЙрддреНрдкрд╛рджрди 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 рдареВрд▓рд╛ рдлрд╛рдЗрджрд╛рд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ:
- рддрдкрд╛рдИрд▓реЗ рдбрд╛рдЯрд╛рдмреЗрд╕ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВрдмрд╛рдЯ рдЕрд▓рдЧ рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ
- рдбрд╛рдЯрд╛рдмреЗрд╕ рдорд╛рдЗрдЧреНрд░реЗрд╕рди рддрдкрд╛рдИрдВрдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╕рдирдХреЛ рд░реЛрд▓рдЖрдЙрдЯрд╕рдБрдЧреИ рд╣реБрдиреНрдЫ, рдЕрд░реНрдерд╛рддреНред рддрдкрд╛рдЗрдБрдХреЛ рддреИрдирд╛рддреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рд░рд▓реАрдХреГрдд рдЫ
рдбрд╛рдЯрд╛рдмреЗрд╕ рд╕рдорд╕реНрдпрд╛рд╣рд░реВрдХреЛ рдирд┐рд╡рд╛рд░рдг
рд▓реЗрдЦрдХреЛ рдЕрд░реНрдХреЛ рдЦрдгреНрдбрдорд╛, рд╣рд╛рдореА рдбрд╛рдЯрд╛рдмреЗрд╕ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ рджреБрдИ рджреГрд╖реНрдЯрд┐рдХреЛрдгрд╣рд░реВ рд╣реЗрд░реНрдирдорд╛ рдзреНрдпрд╛рди рдХреЗрдиреНрджреНрд░рд┐рдд рдЧрд░реНрдиреЗрдЫреМрдВред
- рдкрдЫрд╛рдбрд┐рдХреЛ рдЕрд╕рдВрдЧрддрд┐
- рдкрдЫрд╛рдбрд┐ рдЕрдиреБрдХреВрд▓рддрд╛
рдкрд╣рд┐рд▓реЛрд▓рд╛рдИ рдЪреЗрддрд╛рд╡рдиреАрдХреЛ рд░реВрдкрдорд╛ рдорд╛рдирд┐рдиреЗрдЫ рдХрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдкреНрд░рд╛рд░рдореНрднрд┐рдХ рддрдпрд╛рд░реА рдмрд┐рдирд╛ рд╢реВрдиреНрдп рдбрд╛рдЙрдирдЯрд╛рдЗрдо рдбрд┐рдкреНрд▓реЛрдЗрдореЗрдиреНрдЯ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрдиреБ рд╣реБрдБрджреИрди... рджреЛрд╕реНрд░реЛрд▓реЗ рддрдкрд╛рдЗрдБ рдХрд╕рд░реА рдбрд╛рдЙрдирдЯрд╛рдЗрдо рдмрд┐рдирд╛ рдбрд┐рдкреНрд▓реЛрдпрдореЗрдиреНрдЯ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рд░ рдПрдХреИ рд╕рдордпрдорд╛ рдкрдЫрд╛рдбрд┐ рдЕрдиреБрдХреВрд▓рддрд╛ рдХрд╛рдпрдо рд░рд╛рдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рднрдиреНрдиреЗ рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫред
рд╣рд╛рдореАрд▓реЗ рдХрд╛рдо рдЧрд░реНрдиреЗ рд╣рд╛рдореНрд░реЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд╕рдиреНрдд рдмреБрдЯ рдлреНрд▓рд╛рдИрд╡реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реБрдиреЗрдЫ 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 рдбрд┐рдкреНрд▓реЛрдпрдореЗрдиреНрдЯ рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реЗрдкрдЫрд┐ (рд▓рдЧрднрдЧред рдкреНрд░рддрд┐ред: рд▓реЗрдЦрдХрд▓реЗ рд╕рд╛рдпрдж рдпрд╣рд╛рдБ 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
рд╕реНрд░реЛрдд рдлреНрд▓рд╛рдИрд╡реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ:
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
, рд╡рд╛ l рдмрд╛рдЯ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
, рддреНрдпрд╕реИрд▓реЗ рд░реЛрд▓рдмреНрдпрд╛рдХ рд╕рдлрд▓ рд╣реБрдиреБрдкрд░реНрдЫ
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: рдХреЛрдбрдмрд╛рдЯ рдЕрдиреНрддрд┐рдо_рдирд╛рдо рд╣рдЯрд╛рдЙрдБрджреИ
рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рдВрд╕реНрдХрд░рдг: 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
рдбрд╛рдЯрд╛рдмреЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди
рдбрд╛рдЯрд╛рдмреЗрд╕рдорд╛ рдХреБрдиреИ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдЫреИрдирдиреНред рдкреБрд░рд╛рдиреЛ рдбрд╛рдЯрд╛рдХреЛ рдЕрдиреНрддрд┐рдо рдорд╛рдЗрдЧреНрд░реЗрд╕рди рдЧрд░реНрди рдирд┐рдореНрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░рд┐рдПрдХреЛ рдЫ:
-- WE'RE ASSUMING THAT IT'S A FAST MIGRATION - OTHERWISE WE WOULD HAVE TO MIGRATE IN BATCHES
-- ALSO WE'RE NOT CHECKING IF WE'RE NOT OVERRIDING EXISTING ENTRIES. WE WOULD HAVE TO COMPARE
-- ENTRY VERSIONS TO ENSURE THAT IF THERE IS ALREADY AN ENTRY WITH A HIGHER VERSION NUMBER
-- WE WILL NOT OVERRIDE IT.
UPDATE PERSON SET PERSON.surname = PERSON.last_name;
-- DROPPING THE NOT NULL CONSTRAINT; OTHERWISE YOU WILL TRY TO INSERT NULL VALUE OF THE LAST_NAME
-- WITH A NOT_NULL CONSTRAINT.
ALTER TABLE PERSON MODIFY COLUMN last_name varchar(255) NULL DEFAULT NULL;
рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрди
рдиреЛрдЯ рдкреНрд░рддрд┐ред: рдпрд╕ рдмреНрд▓рдХрдХреЛ рд╡рд┐рд╡рд░рдг рдкрдирд┐ рдЧрд▓реНрддреАрд▓реЗ рдЪрд░рдг 2 рдмрд╛рдЯ рд▓реЗрдЦрдХ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛред рд▓реЗрдЦрдХреЛ рддрд░реНрдХ рдЕрдиреБрд╕рд╛рд░, рдпрд╕ рдЪрд░рдгрдорд╛ рдХреЛрдбрдорд╛ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рд╕реНрддрдореНрднрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рддрддреНрд╡рд╣рд░реВ рд╣рдЯрд╛рдЙрдиреЗ рдЙрджреНрджреЗрд╢реНрдпрд▓реЗ рд╣реБрдиреБрдкрд░реНрдЫред last_name
.
рд╣рд╛рдореА рдбрд╛рдЯрд╛ рд░реВрдкрдорд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрдЫреМрдВ last_name
, рд░ рдорд╛ surname.
рдердк рд░реВрдкрдорд╛, рд╣рд╛рдореА рд╕реНрддрдореНрднрдмрд╛рдЯ рдкрдвреНрдЫреМрдВ last_name
, рдХрд┐рдирдХрд┐ рдпреЛ рд╕рдмреИрднрдиреНрджрд╛ рд╕рд╛рдиреНрджрд░реНрднрд┐рдХ рдЫред рдбрд┐рдкреНрд▓реЛрдЗрдореЗрдиреНрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдХреЛ рдмрдЦрдд, рдХреЗрд╣реА рдЕрдиреБрд░реЛрдзрд╣рд░реВ рдЕрдЭреИ рдЕрдкрдЧреНрд░реЗрдб рдирднрдПрдХреЛ рдЙрджрд╛рд╣рд░рдгрджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╢реЛрдзрди рд╣реБрди рд╕рдХреНрдЫред
/*
* Copyright 2012-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package sample.flyway;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Person {
@Id
@GeneratedValue
private Long id;
private String firstName;
private String surname;
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getSurname() {
return this.surname;
}
public void setSurname(String lastname) {
this.surname = lastname;
}
@Override
public String toString() {
return "Person [firstName=" + this.firstName + ", surname=" + this.surname
+ "]";
}
}
рдЪрд░рдг 4: рдбрд╛рдЯрд╛рдмреЗрд╕рдмрд╛рдЯ рдЕрдиреНрддрд┐рдо_рдирд╛рдо рд╣рдЯрд╛рдЙрдБрджреИ
рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рдВрд╕реНрдХрд░рдг: 4.0.0
DB рд╕рдВрд╕реНрдХрд░рдг: v4
рдЯрд┐рдкреНрдкрдгреА
рдпреЛ рддрдереНрдпрдХреЛ рдХрд╛рд░рдг рд╕рдВрд╕реНрдХрд░рдг рдХреЛрдб 3.0.0
рд╕реНрддрдореНрдн рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрдирдиреН last_name
, рдпрджрд┐ рд╣рд╛рдореА рдлрд┐рд░реНрддрд╛ рдЧрдпреМрдВ рднрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХреЛ рдХреНрд░рдордорд╛ рдХреЗрд╣рд┐ рдЦрд░рд╛рдм рд╣реБрдиреЗрдЫреИрди 3.0.0
рдбрд╛рдЯрд╛рдмреЗрд╕рдмрд╛рдЯ рд╕реНрддрдореНрдн рд╣рдЯрд╛рдЙрди рдкрдЫрд┐ред
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рдЧрд╣рд░реВ
We will do it in the following way:
01) Run 1.0.0
02) Wait for the app (1.0.0) to boot
03) Generate a person by calling POST localhost:9991/person to version 1.0.0
04) Run 2.0.0
05) Wait for the app (2.0.0) to boot
06) Generate a person by calling POST localhost:9991/person to version 1.0.0
07) Generate a person by calling POST localhost:9992/person to version 2.0.0
08) Kill app (1.0.0)
09) Run 3.0.0
10) Wait for the app (3.0.0) to boot
11) Generate a person by calling POST localhost:9992/person to version 2.0.0
12) Generate a person by calling POST localhost:9993/person to version 3.0.0
13) Kill app (3.0.0)
14) Run 4.0.0
15) Wait for the app (4.0.0) to boot
16) Generate a person by calling POST localhost:9993/person to version 3.0.0
17) Generate a person by calling POST localhost:9994/person to version 4.0.0
Starting app in version 1.0.0
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:
{"firstName":"52b6e125-4a5c-429b-a47a-ef18bbc639d2","lastName":"52b6e125-4a5c-429b-a47a-ef18bbc639d2"}
Starting app in version 2.0.0
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:
{"firstName":"e41ee756-4fa7-4737-b832-e28827a00deb","lastName":"e41ee756-4fa7-4737-b832-e28827a00deb"}
Generate a person in version 2.0.0
Sending a post to 127.0.0.1:9992/person. This is the response:
{"firstName":"0c1240f5-649a-4bc5-8aa9-cff855f3927f","lastName":"0c1240f5-649a-4bc5-8aa9-cff855f3927f","surname":"0c1240f5-649a-4bc5-8aa9-cff855f3927f"}
Killing app 1.0.0
Starting app in version 3.0.0
Generate a person in version 2.0.0
Sending a post to 127.0.0.1:9992/person. This is the response:
{"firstName":"74d84a9e-5f44-43b8-907c-148c6d26a71b","lastName":"74d84a9e-5f44-43b8-907c-148c6d26a71b","surname":"74d84a9e-5f44-43b8-907c-148c6d26a71b"}
Generate a person in version 3.0.0
Sending a post to 127.0.0.1:9993/person. This is the response:
{"firstName":"c6564dbe-9ab5-40ae-9077-8ae6668d5862","surname":"c6564dbe-9ab5-40ae-9077-8ae6668d5862"}
Killing app 2.0.0
Starting app in version 4.0.0
Generate a person in version 3.0.0
Sending a post to 127.0.0.1:9993/person. This is the response:
{"firstName":"cbe942fc-832e-45e9-a838-0fae25c10a51","surname":"cbe942fc-832e-45e9-a838-0fae25c10a51"}
Generate a person in version 4.0.0
Sending a post to 127.0.0.1:9994/person. This is the response:
{"firstName":"ff6857ce-9c41-413a-863e-358e2719bf88","surname":"ff6857ce-9c41-413a-863e-358e2719bf88"}
DB рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ
рддреБрд▓рдирд╛рддреНрдордХ рд░реВрдкрдорд╛ v3
рд╣рд╛рдореА рдХреЗрд╡рд▓ рд╕реНрддрдореНрдн рд╣рдЯрд╛рдЙрдБрдЫреМрдВ last_name
рд░ рдЫреБрдЯреЗрдХреЛ рдкреНрд░рддрд┐рдмрдиреНрдзрд╣рд░реВ рдердкреНрдиреБрд╣реЛрд╕реНред
-- REMOVE THE COLUMN
ALTER TABLE PERSON DROP last_name;
-- ADD CONSTRAINTS
UPDATE PERSON SET surname='' WHERE surname IS NULL;
ALTER TABLE PERSON ALTER COLUMN surname VARCHAR NOT NULL;
рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрди
рдХреЛрдбрдорд╛ рдХреБрдиреИ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдЫреИрдирдиреНред
рдирд┐рд╖реНрдХрд░реНрд╖рдорд╛
рд╣рд╛рдореАрд▓реЗ рдзреЗрд░реИ рдкрдЫрд╛рдбрд┐-рдХрдореНрдкреНрдпрд╛рдЯрд┐рдмрд▓ рдбрд┐рдкреНрд▓реЛрдЗрдореЗрдиреНрдЯрд╣рд░реВ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реЗрд░ рдкрдЫрд╛рдбрд┐-рдЕрд╕рдВрдЧрдд рд╕реНрддрдореНрдн рдирд╛рдо рдкрд░рд┐рд╡рд░реНрддрди рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд▓рд╛рдЧреВ рдЧрд░реНрдпреМрдВред рддрд▓ рдЧрд░рд┐рдПрдХрд╛ рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рд╕рд╛рд░рд╛рдВрд╢ рдЫ:
- рдЖрд╡реЗрджрди рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рддреИрдирд╛рддреА
1.0.0
╤Бv1
рдбрд╛рдЯрд╛рдмреЗрд╕ рд╕реНрдХреАрдорд╛ (рд╕реНрддрдореНрдн рдирд╛рдо =last_name
) - рдЖрд╡реЗрджрди рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рддреИрдирд╛рддреА
2.0.0,
рдЬрд╕рд▓реЗ рдбрд╛рдЯрд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрдЫlast_name
╨╕surname
ред рдЖрд╡реЗрджрди рдмрд╛рдЯ рдкрдвреНрдЫlast_name
ред рдбрд╛рдЯрд╛рдмреЗрд╕ рд╕рдВрд╕реНрдХрд░рдгрдорд╛ рдЫv2
рдЬрд╕реНрддрд╛ рд╕реНрддрдореНрднрд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫlast_name
, рд░surname. surname
l рдХреЛ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рд╣реЛ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/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
).
рдпрд╕рдмрд╛рд╣реЗрдХ
рдбрд╛рдЯрд╛рдмреЗрд╕ рд░рд┐рдлреНрдпрд╛рдХреНрдЯрд░рд┐рдВрдЧ рдкреИрдЯрд░реНрди рд▓рдЧрд╛рддрд╛рд░ рд╡рд┐рддрд░рдг
рд╣рд╛рдореНрд░реЛ рдмреНрд▓рдЧрдорд╛ рдЕрдиреНрдп рд▓реЗрдЦрд╣рд░реВ рдкрдирд┐ рдкрдвреНрдиреБрд╣реЛрд╕реН:
Kubernetes: рдХрд┐рди рдпреЛ рдкреНрд░рдгрд╛рд▓реА рд╕рдВрд╕рд╛рдзрди рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рд╕реЗрдЯ рдЕрдк рдЧрд░реНрди рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЫ? Tekton рдкрд╛рдЗрдкрд▓рд╛рдЗрди - Kubernetes-рд╕реНрдерд╛рдиреАрдп рдкрд╛рдЗрдкрд▓рд╛рдЗрди Nginx рдХреЛ рд▓рд╛рдЧрд┐ рдЧрддрд┐рд╢реАрд▓ рдореЛрдбреНрдпреБрд▓рд╣рд░реВ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрджреИ Hashicorp Consul рдХреЛ Kubernetes рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЛ рдкрд░рд┐рдЪрдп рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдмрд┐рдирд╛ рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕рдмрд╛рдЯ рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕рдорд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдгрдХреЛ рд╕рд╛рде рдорд╛рдЗрдЧреНрд░реЗрд╕рдирд▓реЗ рдХреЗ рдирд┐рдореНрддреНрдпрд╛рдпреЛ? Nginx рд╡реЗрдм рд╕рд░реНрднрд░рдХреЛ рд╕рд╛рде рд╡рд╕рдиреНрдд рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВрдХреЛ рдирд┐рд▓реЛ-рд╣рд░рд┐рдпреЛ рддреИрдирд╛рддреА
рд╕реНрд░реЛрдд: www.habr.com