Knex: Knex рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВред

рдХреЛ рдирд┐рд░реНрдорд┐рдд 21 рдордИ 2017  ┬╖  28рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: knex/knex

(рдореВрд▓ рд░реВрдк рд╕реЗ # 1659 рдореЗрдВ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЖрдЧреЗ рдХреА рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред)

рдореИрдВ рдЗрд╕ рдкрд░ рдПрдХ рддрд░рд╣ рд╕реЗ рдЕрдВрдзреЗрд░реЗ рдореЗрдВ рд╣реВрдВ - рдиреЙрдЯ рдбреЙрдХреНрд╕ рд▓реЗрдирджреЗрди рдХреЗ рдирдВрдЧреЗ рдкрд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ "рдпреВрдирд┐рдЯ рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП knex.js" рдФрд░ "ava.js + knex" рдФрд░ "ava.js" рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред , рдореБрдЭреЗ рдПрдХ рдЕрдЪреНрдЫрд╛ рд░рд╛рд╕реНрддрд╛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╢рд┐рдХреНрд╖рд╛рдкреНрд░рдж рдХреБрдЫ рднреА рдирд╣реАрдВ рдорд┐рд▓рд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЕрдкрдиреЗ рд░реВрдмреА рдЕрдиреБрднрд╡ рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛, рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рдж рдбреАрдмреА рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реЗрдирджреЗрди рдореЗрдВ рдПрдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд▓рдкреЗрдЯрдирд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рддрдХрдиреАрдХ рд╣реИред

@odigity рдореИрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ

рдореЗрд░реЗ рд╕рд╛рде рдРрд╕рд╛ рд╣реБрдЖ, рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣ рдорд╛рдирдиреЗ рдХреЛ рддреИрдпрд╛рд░ рдерд╛ рдХрд┐ рдЕрдЧрд░ рдЙрд╕рдиреЗ рдореБрдЭреЗ рдкреЛрд╕реНрдЯ-рдбреАрдмреА рд╕рдлрд╛рдИ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓, рд▓рд┐рдЦрд┐рдд-рдПрдХ рдмрд╛рд░ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рд╣реИред (рдореИрдВрдиреЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдкреВрд▓ рдорд┐рдирдЯ / рдЕрдзрд┐рдХрддрдо рдХреЛ 1 рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИред) рдпрджрд┐ рд╕рдорд╡рд░реНрддреА рдХрдиреЗрдХреНрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╕рдордп рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕реЗ рдЧрд▓реЗ рд▓рдЧрд╛рдКрдВрдЧрд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЬрдм рддрдХ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддрдм рддрдХ рдЗрд╕реЗ рдЙрд╕реА рдХреЛрдб рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдХреЗ рдЕрдВрджрд░ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдЖрдкрдХреЛ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рд▓реЗрди-рджреЗрди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рддрдм рдЕрдкрдирд╛ рдРрдк рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рдмрдирд╛рдП рдЧрдП рд▓реЗрди-рджреЗрди рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕рдВрднрд╡ рд╣реИред рдПрдХ рд╣реА рд▓реЗрди-рджреЗрди рдФрд░ рдиреЗрд╕реНрдЯреЗрдб рд▓реЗрди-рджреЗрди рдХреЗ рд╕рднреА рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ ...)ред

рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдореБрдЭреЗ рдЙрдореНрдореАрдж рдереА / рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ:

1) рдкреНрд░рддреНрдпреЗрдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ, рдореИрдВ рдПрдХ рд▓реЗрдирджреЗрди рдмрдирд╛рддрд╛ рд╣реВрдВ рдЬреЛ trx рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИред

2) рдореБрдЭреЗ рддрдм рдореЙрдбреНрдпреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдореИрдВ рдореЙрдбреНрдпреВрд▓ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ trx рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдФрд░ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореЙрдбреНрдпреВрд▓ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓реЗрдирджреЗрди рдХреЗ рдЕрдВрджрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдкред

3) рдореЙрдбреНрдпреВрд▓ рд╡рд┐рдзрд┐ рдХреЗ рд▓реМрдЯрдиреЗ рдХреЗ рдмрд╛рдж (рдпрд╛ рддреНрд░реБрдЯрд┐ рдХреЛ рдлреЗрдВрдХрддрд╛ рд╣реИ), рдореИрдВ рдЕрдкрдиреЗ рдЕрднрд┐рдХрдерди рдХреЛ рдбреАрдмреА рдХреЗ рдкрд░рд┐рдгрд╛рдореА рд╕реНрдерд┐рддрд┐ рдкрд░ рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, рдлрд┐рд░ рдЕрдЧрд▓реЗ рдкрд░реАрдХреНрд╖рдг рдХреА рддреИрдпрд╛рд░реА рдХреЗ рд▓рд┐рдП рд╢реБрд░реВ рд╕реЗ рд╕рдм рдХреБрдЫ рдкреВрд░реНрд╡рд╡рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП trx.rollback() рдХреЙрд▓ рдХрд░реЗрдВред

рдЗрд╕рд▓рд┐рдП, рдпрд╣реА рдореИрдВ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореВрд▓ рд░реВрдк рд╕реЗ рдореИрдВ рдЗрд╕реЗ рдХреИрд╕реЗ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рд╣реВрдВ:

1) рдореИрдВ рдХрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЧрд▓рдд рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ Knex.js рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

2) рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдЫреВрдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдкрд░рдорд╛рдгреБ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕ред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдирд╣реАрдВ - рдХреБрдЫ рдирд╣реАрдВ рдорд┐рд▓рд╛ред рд╕реНрд░реЛрддреЛрдВ рдХреЗ рдХрд╛рд▓рд╛рдиреБрдХреНрд░рдорд┐рдХ рдХреНрд░рдо рдореЗрдВ рд╕рд╛рд░рд╛рдВрд╢:

2016-04-21 https://medium.com/@jomaora/knex -bookshelf-mocks- рдФрд░ рдпреВрдирд┐рдЯ-рдкрд░реАрдХреНрд╖рдг-cca627565d3

рд░рдгрдиреАрддрд┐: рдореЙрдХ-рдиреЙрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдореИрдВ DB рдХрд╛ рдордЬрд╛рдХ рдирд╣реАрдВ рдЙрдбрд╝рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ - рдореИрдВ рд╕рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ MySQL DB рдХреЗ рдЦрд┐рд▓рд╛рдл рдЕрдкрдиреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ - рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ mock-knex рд╡реИрд╕реЗ рднреА рджреЗрдЦ рд▓рд┐рдпрд╛ ... рдпрд╣ рд╕рд┐рд░реНрдл рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рдбрд┐рдЬрд╛рдЗрди рдХреА рдЧрдИ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реЛ рд╕рдХрддреА рд╣реИ рдореИрдВрдиреЗ рдХрднреА рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ред :(

2016-04-28 http://mherman.org/blog/2016/04/28/test-driven-development-with/nlog/

рд░рдгрдиреАрддрд┐: рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рдж рд░реЛрд▓рдмреИрдХ / рд░реАрдордЧреЗрдЯ / рдбреАрдмреА рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдУрд╡рд░рд╣реЗрдб рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рд╕реМрджрд╛ рд╣реИ, рдФрд░ рдмрд╣реБрдд рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдЪрд▓реЗрдЧрд╛ред рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ DB рдирд╛рдо рдХреЗ рд▓рд┐рдП UUID рдмрдирд╛рдХрд░ Concurrency рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд▓реЗрдирджреЗрди рдХреЗ рд▓рд╛рд▓рд┐рддреНрдп рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рднрдпрд╛рдирдХ рд╕рдорд╛рдзрд╛рди рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ ...

2015-09-23 http://stackoverflow.com/a/32749601/210867

рд░рдгрдиреАрддрд┐: рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП DB рдХреЛ рдкрд░реАрдХреНрд╖рдг, рдмрдирд╛рдиреЗ / рдирд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрдХреНрд▓рд╛рдЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдореИрдВрдиреЗ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдирд╛рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реБрдП рджреЛрдиреЛрдВ рдХрд╛рд░рдгреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд┐рдпрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП ... рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдордЫрд▓реА рдкрдХрдбрд╝рдирд╛, рдФрд░ Knex рд▓реЗрдирджреЗрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕ рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдорд╛рд░реНрдЧрджрд░реНрд╢рди, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЙрдиреНрд╣реЗрдВ рдореЗрд░реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдареАрдХ рд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рд╕рднреА 28 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВрдиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд▓ рд░рд╛рдд рдПрдХ рдЦрд░рд╛рдм рдХрд╛рдо рдХрд┐рдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЕрднреА "knex.js рдХреЗ рд╕рд╛рде рдкрд░рдорд╛рдгреБ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реИ" рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХреА, рдФрд░ рдореБрдЭреЗ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓ рд░рд╣реЗ рд╣реИрдВред рдЕрдм рдЙрдирдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдЕрдЧрд░ рдореИрдВ рдХреБрдЫ рд╕реАрдЦрддрд╛ рд╣реВрдВ рддреЛ рдлрд┐рд░ рд╕реЗ рдкреЛрд╕реНрдЯ рдХрд░реВрдВрдЧрд╛ред

рдирд╣реАрдВ - рдХреБрдЫ рдирд╣реАрдВ рдорд┐рд▓рд╛ред рд╕реНрд░реЛрддреЛрдВ рдХреЗ рдХрд╛рд▓рд╛рдиреБрдХреНрд░рдорд┐рдХ рдХреНрд░рдо рдореЗрдВ рд╕рд╛рд░рд╛рдВрд╢:

2016-04-21 https://medium.com/@jomaora/knex -bookshelf-mocks- рдФрд░ рдпреВрдирд┐рдЯ-рдкрд░реАрдХреНрд╖рдг-cca627565d3

рд░рдгрдиреАрддрд┐: рдореЙрдХ-рдиреЙрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдореИрдВ DB рдХрд╛ рдордЬрд╛рдХ рдирд╣реАрдВ рдЙрдбрд╝рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ - рдореИрдВ рд╕рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ MySQL DB рдХреЗ рдЦрд┐рд▓рд╛рдл рдЕрдкрдиреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ - рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ mock-knex рд╡реИрд╕реЗ рднреА рджреЗрдЦ рд▓рд┐рдпрд╛ ... рдпрд╣ рд╕рд┐рд░реНрдл рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рдбрд┐рдЬрд╛рдЗрди рдХреА рдЧрдИ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реЛ рд╕рдХрддреА рд╣реИ рдореИрдВрдиреЗ рдХрднреА рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ред :(

2016-04-28 http://mherman.org/blog/2016/04/28/test-driven-development-with/nlog/

рд░рдгрдиреАрддрд┐: рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рдж рд░реЛрд▓рдмреИрдХ / рд░реАрдордЧреЗрдЯ / рдбреАрдмреА рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдУрд╡рд░рд╣реЗрдб рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рд╕реМрджрд╛ рд╣реИ, рдФрд░ рдмрд╣реБрдд рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдЪрд▓реЗрдЧрд╛ред рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ DB рдирд╛рдо рдХреЗ рд▓рд┐рдП UUID рдмрдирд╛рдХрд░ Concurrency рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд▓реЗрдирджреЗрди рдХреЗ рд▓рд╛рд▓рд┐рддреНрдп рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рднрдпрд╛рдирдХ рд╕рдорд╛рдзрд╛рди рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ ...

2015-09-23 http://stackoverflow.com/a/32749601/210867

рд░рдгрдиреАрддрд┐: рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП DB рдХреЛ рдкрд░реАрдХреНрд╖рдг, рдмрдирд╛рдиреЗ / рдирд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрдХреНрд▓рд╛рдЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдореИрдВрдиреЗ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдирд╛рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реБрдП рджреЛрдиреЛрдВ рдХрд╛рд░рдгреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд┐рдпрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП ... рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдордЫрд▓реА рдкрдХрдбрд╝рдирд╛, рдФрд░ Knex рд▓реЗрдирджреЗрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕ рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдорд╛рд░реНрдЧрджрд░реНрд╢рди, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЙрдиреНрд╣реЗрдВ рдореЗрд░реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдареАрдХ рд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред

@odigity рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЦрд░рд╛рдм рдкрд░реАрдХреНрд╖рдг рдкреНрд░рдерд╛рдУрдВ рдХреЛ рдЕрднрд┐рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛

рд╣рдо рдЕрдкрдиреЗ "рдпреВрдирд┐рдЯ" рдкрд░реАрдХреНрд╖рдг рдЗрд╕ рддрд░рд╣ рдХрд░ рд░рд╣реЗ рд╣реИрдВ:

  1. рд╕рд┐рд╕реНрдЯрдо рд╢реБрд░реВ рдХрд░реЗрдВ, рдбреАрдмреА рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВ рдФрд░ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдЪрд▓рд╛рдПрдВ

  2. рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдкрд╣рд▓реЗ рд╣рдо рд╕рднреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдФрд░ рдЕрдиреБрдХреНрд░рдореЛрдВ (knex-db-manager рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде) рдХреЛ рдХрд╛рдЯрддреЗ рд╣реИрдВ

  3. рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдВ (рд╣рдо knex рдЖрдзрд╛рд░рд┐рдд рдЖрдкрддреНрддрд┐.js ORM рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рдПрдХрд▓ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдиреЗрд╕реНрдЯреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдкрджрд╛рдиреБрдХреНрд░рдо рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдпрд╣ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЖрд╡реЗрд╖рдг рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХреИрд╕реЗ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЗрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдореНрдорд┐рд▓рд┐рдд рди рдХрд░рдирд╛ рдкрдбрд╝реЗред рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ, рд▓реЗрдХрд┐рди рдЖрдорддреМрд░ рдкрд░ рдкреНрд░рддрд┐ рддрд╛рд▓рд┐рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╕рдореНрдорд┐рд▓рд┐рдд рд╣реЛрддреА рд╣реИ)

  4. рд░рди 1 рдЯреЗрд╕реНрдЯ рдФрд░ рдЧреЛрдЯреЛ рдЪрд░рдг 2

E2e рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╣рдордиреЗ saveState / RestoreState (pg_restore / pg_dump рдХреЗ рд╕рд╛рде) рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рд╣рдореЗрдВ рдЯреЗрд╕реНрдЯ рд░рди рдХреЗ рджреМрд░рд╛рди рдХреБрдЫ рдирд┐рд╢реНрдЪрд┐рдд рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд╣рд░ рдмрд╛рд░ рдЬрдм 20 рдмрд╛рд░ рджреМрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж рдХреЛрдИ рднреА рдкрд░реАрдХреНрд╖рд╛ рд╡рд┐рдлрд▓ рд╣реЛрддреА рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЯреЗрд╕реНрдЯ рд░рди рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдкрд░реАрдХреНрд╖рдг рдХреЗ рдорд┐рдирдЯред

рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдореИрдВрдиреЗ рдХрд▓ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд░рд▓ рдФрд░ рд╕реАрдзрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдкреНрд░рдЧрддрд┐ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

рдХреНрдпрд╛ рдЖрдкрдиреЗ рд▓реЗрди-рджреЗрди рдореЗрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдФрд░ рдЯреНрд░рдВрдХрдЯ-рдСрд▓-рдЯреЗрдмрд▓ рдХреЗ рддреЗрдЬреА рд╕реЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рд░реЛрд▓ рдХрд░рдиреЗ рдХреА рд░рдгрдиреАрддрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ? рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рдЕрдЧрд░ рдореИрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реВрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдЙрд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ db рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдореЗрдВ рд▓реЗрди-рджреЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЙрд╕ рд▓реЗрдирджреЗрди рдХреЛ рдЕрдкрдиреЗ knex- рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (knex рдЙрджрд╛рд╣рд░рдг рдФрд░ рд▓реЗрдирджреЗрди рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдорддреМрд░ рдкрд░ рдЖрдк рд▓реЗрдирджреЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд╕рд╛рдорд╛рдиреНрдп knex рдЙрджрд╛рд╣рд░рдг рдХреА рддрд░рд╣ рдЙрджрд╛рд╣рд░рдг)ред

рдлрд┐рд░ рдЖрдк рдЕрдкрдирд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рдкреВрд▓ рдХрд┐рдП рдЧрдП рдиреЗрдХреНрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдмрдЬрд╛рдп рд▓реЗрди-рджреЗрди рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрд╕реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╢реНрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред

рдУрдкреА рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╣реА рдЙрд╕реА рддрд░рд╣ред рдЖрдкрдиреЗ рдмрддрд╛рдпрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд▓рдЧрддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдХреБрдЫ рд╡рд░реНрд╖реЛрдВ рдкрд╣рд▓реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ DB рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрдирджреЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд▓рд┐рдВрдЧ рдХреЛ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдпрд╣ рдРрдк + рдЯреНрд░рдВрдХрдЯ / рдЗрдирд┐рдЯ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрд╛рдлреА рддреЗрдЬ рд╣реИред

рдХреНрдпрд╛ рд▓реЗрди-рджреЗрди рдХреА рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдз рдЖрддреНрдореАрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рдмреИрдЪ рдореЗрдВ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдкреНрд░рд╢реНрди рдПрдХ рд╣реА рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЗрд╕ рддрд░рд╣ рдПрдХ рд╣реА рд▓реЗрдирджреЗрди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдЧрд╛?

рдЯреНрд░рдВрдХрдЯ рд░рдгрдиреАрддрд┐ рдХрд╛рд░реНрдп рдХреА рддрд░рд╣ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рд╣реА рдХреНрд░реВрд░ рдмрд▓ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ test.after.always () рд╣реБрдХ рд╣реИ рдЬреЛ рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рддрд╛рд▓рд┐рдХрд╛рдУрдВ (рдЖрдорддреМрд░ рдкрд░ рдкреНрд░рддрд┐ рдлрд╝рд╛рдЗрд▓ рдПрдХ рддрд╛рд▓рд┐рдХрд╛) рдХреЛ рдХрд╛рдЯрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЙрди рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреЛ рдЙрд╕ рдкрд░ рдЦрд░рд╛рдм рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдПрдХ рд╣реА рдЯреЗрдмрд▓ рд░рди рдХреЛ рдЫреВрдиреЗ рд╡рд╛рд▓реА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯреЗрд╕реНрдЯ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕реЗ рджреЛ рдЯреЗрд╕реНрдЯ, рдПрдХ рдлрд╛рдЗрд▓ рдХреЗ рдЯреНрд░рдВрдХрдЯ рд╣реБрдХ рдХреЛ рдХрд┐рдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рджреВрд╕рд░реА рдлрд╛рдЗрд▓ рдХреЗ рдЯреЗрд╕реНрдЯ рд░рдирд┐рдВрдЧ рдХреЗ рдмреАрдЪ рдореЗрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдЙрд╕ рдЯреЗрд╕реНрдЯ рдХреЛ рдЦрд░рд╛рдм рдХрд░ рджреЗрддреЗ рд╣реИрдВред

рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдЕрднреА рднреА рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ Knex рдореЗрдВ рд▓реЗрдирджреЗрди рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЕрдЧрд░ рдореИрдВ рдПрдХ рдмрдирд╛рдиреЗ trx рдХреЗ рд╕рд╛рде knex.transaction() рд╣реЛрдЧрд╛ рд╕рднреА рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪрд▓рд╛рдП, trx рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓реЗрди-рджреЗрди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛ? рдХреНрдпрд╛ рдореБрдЭреЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ / рд░реЛрд▓рдмреИрдХ рдХрд░рдирд╛ рд╣реИ? (рдирд╣реАрдВ рдлреЗрдВрдХреА рдЧрдИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдорд╛рдирддреЗ рд╣реБрдПред)

рдХреНрдпрд╛ рд▓реЗрди-рджреЗрди рдХреА рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдз рдЖрддреНрдореАрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рдмреИрдЪ рдореЗрдВ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдкреНрд░рд╢реНрди рдПрдХ рд╣реА рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЗрд╕ рддрд░рд╣ рдПрдХ рд╣реА рд▓реЗрдирджреЗрди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдЧрд╛?

рдореБрдЭреЗ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛

рдЯреНрд░рдВрдХрдЯ рд░рдгрдиреАрддрд┐ рдХрд╛рд░реНрдп рдХреА рддрд░рд╣ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рд╣реА рдХреНрд░реВрд░ рдмрд▓ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ test.after.always () рд╣реБрдХ рд╣реИ рдЬреЛ рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рддрд╛рд▓рд┐рдХрд╛рдУрдВ (рдЖрдорддреМрд░ рдкрд░ рдкреНрд░рддрд┐ рдлрд╝рд╛рдЗрд▓ рдПрдХ рддрд╛рд▓рд┐рдХрд╛) рдХреЛ рдХрд╛рдЯрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЙрди рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреЛ рдЙрд╕ рдкрд░ рдЦрд░рд╛рдм рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдПрдХ рд╣реА рдЯреЗрдмрд▓ рд░рди рдХреЛ рдЫреВрдиреЗ рд╡рд╛рд▓реА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯреЗрд╕реНрдЯ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕реЗ рджреЛ рдЯреЗрд╕реНрдЯ, рдПрдХ рдлрд╛рдЗрд▓ рдХреЗ рдЯреНрд░рдВрдХрдЯ рд╣реБрдХ рдХреЛ рдХрд┐рдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рджреВрд╕рд░реА рдлрд╛рдЗрд▓ рдХреЗ рдЯреЗрд╕реНрдЯ рд░рдирд┐рдВрдЧ рдХреЗ рдмреАрдЪ рдореЗрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдЙрд╕ рдЯреЗрд╕реНрдЯ рдХреЛ рдЦрд░рд╛рдм рдХрд░ рджреЗрддреЗ рд╣реИрдВред

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдк рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрдирджреЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдХрдИ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдЪрд▓рд╛ рдкрд╛рдПрдВрдЧреЗред рдЖрдИрдбреА рдХреНрд░рдо рдЕрд▓рдЧ рд╣реЛрдВрдЧреЗ рдФрд░ рд▓реЗрдирджреЗрди рдЧрддрд┐рд░реЛрдз рдЖрджрд┐ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдЕрднреА рднреА рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ Knex рдореЗрдВ рд▓реЗрдирджреЗрди рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдореИрдВ knex.transaction () рдХреЗ рд╕рд╛рде рдПрдХ рдЯреНрд░рд┐рдХреНрд╕ рдмрдирд╛рддрд╛ рд╣реВрдВ, рддреЛ рдХреНрдпрд╛ рдЯреНрд░рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдкреНрд░рд╢реНрди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓реЗрдирджреЗрди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдВрдЧреЗ? рдХреНрдпрд╛ рдореБрдЭреЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ / рд░реЛрд▓рдмреИрдХ рдХрд░рдирд╛ рд╣реИ? (рдирд╣реАрдВ рдлреЗрдВрдХреА рдЧрдИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдорд╛рдирддреЗ рд╣реБрдПред)

рдпрд╣ рдПрдХ рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк knex.transaction(callback) рдореЗрдВ рдХреЙрд▓рдмреИрдХ рд╕реЗ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдмрджреНрдз / рд░реЛрд▓рдмреИрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдХреЙрд▓рдмреИрдХ рд░рд┐рдЯрд░реНрди рдХрд╛ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХрдорд┐рдЯ / рд░реЛрд▓рдмреИрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдкрдХреЛ рд╕рдВрднрд╡рддрдГ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд░реЛрд▓рдмреИрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдк рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрдирджреЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдХрдИ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдЪрд▓рд╛ рдкрд╛рдПрдВрдЧреЗред рдЖрдИрдбреА рдХреНрд░рдо рдЕрд▓рдЧ рд╣реЛрдВрдЧреЗ рдФрд░ рд▓реЗрдирджреЗрди рдЧрддрд┐рд░реЛрдз рдЖрджрд┐ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП рд░реИрдВрдбрдорд▓реА рдЖрдИрдбреА рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВред рдЯрдХрд░рд╛рд╡ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЕрдЧрд░ рдпрд╣ рдХрд┐рд╕реА рджрд┐рди рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдкрд░реАрдХреНрд╖рд╛ рд╣реИ - рдЧреНрд░рд╛рд╣рдХ-рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рдирд╣реАрдВред

рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рдореЗрдВ, рдореИрдВ рдЙрди рд╕рднреА рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдорд╛рди рд░рд╣рд╛ рд╣реВрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдПрдХ рд╣реА рд▓реЗрдирджреЗрди рдореЗрдВ рд╕рдореВрд╣реАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрд╕реА DB рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рдореИрдВ рдЕрдкрдирд╛ Knex рдкреВрд▓ рдЖрдХрд╛рд░ рд╕реЗрдЯ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред 1. рддрдм рдореБрдЭреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдПрдХ рдореЗрдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА .serial рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдЕрднреА рднреА рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдЧрд╛рдорд┐рддрд┐ (рдЬреЛ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░рдХ рд╣реИ), рдХреНрдпреЛрдВрдХрд┐ рдПрд╡рд╛ рдПрдХ рдЕрд▓рдЧ рдмрдЪреНрдЪреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рд╛ рдлрд╝рд╛рдЗрд▓ рдЪрд▓рд╛рддрд╛ рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рдЗрд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдБ!

https://gist.github.com/odigity/7f37077de74964051d45c4ca80ec3250

рдореИрдВ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЕрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реБрдХ рдХреЗ рдкрд╣рд▓реЗ / рдмрд╛рдж рдореЗрдВ рдПрдХ рдореЙрдХ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рджреГрд╢реНрдп рдмрдирд╛рдпрд╛ред

рд╣реБрдХ рд╕реЗ рдкрд╣рд▓реЗ

  • рдХреНрдпреЛрдВрдХрд┐ рд▓реЗрди-рджреЗрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╣реИ, рдореИрдВ before рд╣реБрдХ рд╕реЗ рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕рдХреЗ resolve рдкрджреНрдзрддрд┐ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ transaction() рдХреЙрд▓рдмреИрдХ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  • рдореИрдВ рдПрдХ рд▓реЗрди-рджреЗрди рдЦреЛрд▓рддрд╛ рд╣реВрдВред рдХреЙрд▓рдмреИрдХ рдореЗрдВ, рдореИрдВ ...

    • рдПрдХ рдЬрдЧрд╣ рдкрд░ tx рд╣реИрдВрдбрд▓ рдХреЛ рд╕рд╣реЗрдЬреЗрдВ рдЬреЛ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╕реБрд▓рдн рд╣реЛрдЧрд╛ рдФрд░ after рд╣реБрдХ

    • "рдкрд░реАрдХреНрд╖рдг рдврд╛рдВрдЪреЗ" рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реЗрдЬреЗ рдЧрдП resolve рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ рдХрд┐ before рд╣реБрдХ рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдкрд░реАрдХреНрд╖рдг рд╢реБрд░реВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

рдкрд░реАрдХреНрд╖рдг - рдореИрдВ рд╕рд╣реЗрдЬреЗ рдЧрдП tx рд╣реИрдВрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреЛ рдЖрд╡реЗрд╖рдг рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реВрдВред

рд╣реБрдХ рдХреЗ рдмрд╛рдж - рдореИрдВ рд▓реЗрдирджреЗрди рдХреЛ рд░реЛрд▓рдмреИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реЗрдЬреЗ рдЧрдП tx рд╣реИрдВрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдХрд┐рдП рдЧрдП рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдкреВрд░реНрд╡рд╡рдд рдХрд░рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдбреЗрдЯрд╛ рдХрднреА рднреА рдкреНрд░рддрд┐рдмрджреНрдз рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЕрдиреНрдп рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рджреЗрдЦрд╛ рдпрд╛ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдХрдВрдЬреЗрдВрд╕реА рдкрд░

Knex

Knex рдЖрдкрдХреЛ рдХрдиреЗрдХреНрд╢рди рдкреВрд▓ рдЖрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ рд╣реА рдХрдиреЗрдХреНрд╢рди рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рд▓реЗрди-рджреЗрди рдореЗрдВ рд╕рднреА рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╣рдо рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ), рддреЛ рдЖрдк рдкреВрд▓ рдЖрдХрд╛рд░ рдХреЛ 1 рдкрд░ рд╕реЗрдЯ рдХрд░рдХреЗ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

_But рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ ... рд╕реНрд░реЛрдд рдореЗрдВ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:

// We need to make a client object which always acquires the same
// connection and does not release back into the pool.
function makeTxClient(trx, client, connection) {

рдЕрдЧрд░ рдореИрдВ рдЗрд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ Knex рдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднрд░реЛрд╕рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд▓реЗрдирджреЗрди рдореЗрдВ рд╕рднреА рдкреНрд░рд╢реНрди рдПрдХ рд╣реА рдХрдиреЗрдХреНрд╢рди рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рдЖрдкрдХрд╛ рдкреВрд▓ 1 рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ! рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЕрдкрдиреЗ рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдбрд┐рдЧреНрд░реА рдХреЗ рдмрд▓рд┐рджрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

BTW - рдбреЙрдХреНрд╕ рдХреЛ рд╕рдВрднрд╡рддрдГ рдЗрд╕ рдЖрд╡рд╢реНрдпрдХ рдФрд░ рдЕрджреНрднреБрдд рддрдереНрдп рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЕрд╡рд╛

_ рдореИрдВ рдЗрд╕ рд╡рд┐рд╢реЗрд╖-рд╡рд┐рд╢реЗрд╖ рдХреЛ рдХреНрдиреЗрдХреНрд╕-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЗ рдмрдЬрд╛рдп рдЬрд╛рдирддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рдврд╛рдВрдЪрд╛ рд╣реИ, рдФрд░ рдкрд╛рда рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдЬреНрдпрд╛рджрд╛рддрд░ рдЪреМрдЦрдЯреЗ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ_

рдЕрд╡рд╛ рдкреНрд░рддреНрдпреЗрдХ рдЯреЗрд╕реНрдЯрдлрд╝рд╛рдЗрд▓ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕рдорд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдЪрд▓рд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рднреАрддрд░, рдпрд╣ рд╕рднреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рд╕рдорд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдЪрд▓рд╛рддрд╛ рд╣реИред рд╕рдВрдЧрд╛рдорд┐рддрд┐ рдХреЗ рджреЛрдиреЛрдВ рд░реВрдк --serial CLI рд╡рд┐рдХрд▓реНрдк (рдЬреЛ рд╕рдм рдХреБрдЫ рдХреНрд░рдордмрджреНрдз рдХрд░рддреЗ рд╣реИрдВ) рдпрд╛ .serial рд╕рдВрд╢реЛрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ test рд╡рд┐рдзрд┐ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ (рдЬреЛ рдХрд┐ рдЪрд┐рд╣реНрдирд┐рдд рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЪрд┐рдиреНрд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ) ) рд╣реИред

рд▓рдкреЗрдЯреЗрдВ

рдЬрдм рдореИрдВрдиреЗ рдЗрди рд╕рднреА рддрдереНрдпреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рд░рдЦрд╛:

  • рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреЛ рд▓реЗрди-рджреЗрди рдореЗрдВ рд▓рдкреЗрдЯ рд╕рдХрддрд╛ рд╣реВрдВ, рдЬреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ (рдХ) рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ (рдмреА) рдХреЗ рдмрд┐рдирд╛ рдЯрдХрд░рд╛рд╡ рдпрд╛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдмрд┐рдирд╛ рд╕реНрд╡рдд: рдкреЛрд╕реНрдЯ-рдЯреЗрд╕реНрдЯ рдХреНрд▓реАрдирдЕрдк рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕ рд░рдгрдиреАрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдг рдбреАрдмреА рдХрд╛ рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рдХрднреА рднреА рдЖрд╡рд╢реНрдпрдХ рдмреАрдЬ рдбреЗрдЯрд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдПрдХ рдПрдХрд▓ рд░рд┐рдХреЙрд░реНрдб рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

  • рдореИрдВ рдЕрд╡рд╛ рдХреЗ рдЗрдВрдЯрд░-рдЯреЗрд╕реНрдЯреАрдлрд╛рдЗрд▓ рдХреЙрдиреНрд╕реЗрдкреНрдЯ рд╕реЗ рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЯреЗрд╕реНрдЯрдлрд╛рдЗрд▓ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЗрд╕рдХрд╛ рдЦреБрдж рдХреНрдиреЗрдХреНрд╕ рдХрдиреЗрдХреНрд╢рди рдкреВрд▓ рд╣реЛрдЧрд╛ред

  • рдЕрдЧрд░ рдореИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реВрдВ рдХрд┐ рдореЗрд░рд╛ рдХрдиреЗрдХреНрд╢рди рдкреВрд▓ рд╣реИ> = = рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ред рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рднреА рдлрд╛рдЗрд▓ рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдП рд╣реИрдВ, рдЬреЛ рдореИрдВ рд╡реИрд╕реЗ рднреА рдмрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреВрд▓ рдХреЛ 1-10 рдЬреИрд╕реА рд╕реАрдорд╛ рдХреЗ рд╕рд╛рде рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдРрд╕реЗ рдХрдиреЗрдХреНрд╢рди рдирд╣реАрдВ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рдирдХреА рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдпрд╛ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред


рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдХреЗ рдЪреМрд░рд╛рд╣реЗ рдкрд░ рдбрдмрд┐рдВрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдирдП рд╣реИрдВ ...

@odigity yup, knex рдореЗрдВ рд▓реЗрди-рджреЗрди рдмрд╣реБрдд рд╣реА рд╕рдорд░реНрдкрд┐рдд рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрдВрдбрд▓ рд╣реИ рдЬрд╣рд╛рдБ knex рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ BEGIN рдХреНрд╡реЗрд░реА рдЬреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ рдЬрдм trx рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ SQL рдореЗрдВ рд▓реЗрди-рджреЗрди рдЖрдо рддреМрд░ рдкрд░ BEGIN рд╕реЗ рдЬреБрдбрд╝реЗ рдЙрд╕реА рдХрдиреЗрдХреНрд╢рди рдкрд░ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрди рд╣реИрдВ)ред

рдпрджрд┐ knex рд▓реЗрди-рджреЗрди рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрд╢рди рдЖрд╡рдВрдЯрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рддреЛ рд▓реЗрдирджреЗрди рдмрд╕ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

Uuid рдХреБрдВрдЬрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдпрд╛ рддреЛ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, рдЯрдХрд░рд╛рд╡ рдХрд╛ рдкрд░рд┐рд╡рд░реНрддрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдИ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рди рд╣реЛрдВред ("рдпрджрд┐ рдЖрдк 128-рдмрд┐рдЯ UUID рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ 'рдЬрдиреНрдорджрд┐рди рдХрд╛ рдкреНрд░рднрд╛рд╡' рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓рдЧрднрдЧ 2 ^ 64 рдХреБрдВрдЬреА рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЯрдХрд░рд╛рд╡ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдмрд╢рд░реНрддреЗ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреНрд░рддреНрдпреЗрдХ рдХреБрдВрдЬреА рдореЗрдВ 128 рдмрд┐рдЯреНрд╕ рдПрдиреНрдЯреНрд░реЙрдкреА рд╣реЛред"

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЬрд╡рд╛рдм рдорд┐рд▓ рдЧрдП, рдЗрд╕рд▓рд┐рдП рдЗрд╕ ЁЯСН рдХреЛ рдмрдВрдж рдХрд░рдирд╛

рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрдм рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рддрдм рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬрдм рдЗрд╕реЗ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдореЗрд░реА рд╕рдордЭ рдХреЛ рд╕рд╣реА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдпрджрд┐ рдореИрдВ рдкреВрд▓ рдЖрдХрд╛рд░ рдХреЛ 1 рдкрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдПрдХ рд▓реЗрди-рджреЗрди рдЦреЛрд▓реЗрдВ, рдлрд┐рд░ рдПрдХ рдХреНрд╡реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ, рдпрд╣ рд╕рдордп рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдХрдиреЗрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ - рдЬреЛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдкрд╣рд▓реЗ рд╣реА рд▓реЗрдирджреЗрди рджреНрд╡рд╛рд░рд╛ рд▓реЙрдХ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдЧрд░ рдореИрдВ рдкреВрд▓ рдХрд╛ рдЖрдХрд╛рд░ 1 рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЪрд╛рд░ рдкрд░реАрдХреНрд╖рдг рд╕рдорд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ:

  • рдПрдХ рд▓реЗрди-рджреЗрди рдЦреЛрд▓рддрд╛ рд╣реИ
  • рдкреНрд░рд╢реНрди рдЪрд▓рд╛рддрд╛ рд╣реИ
  • рдЕрдВрдд рдореЗрдВ рд░реЛрд▓рдмреИрдХ рдХрд╣рддрд╛ рд╣реИ

рд╡реЗ рд╕рднреА рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП - рдХрдо рд╕реЗ рдХрдо рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рдХрдиреЗрдХреНрд╢рди рдХреА рдХрдореА рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП - рд▓реЗрдХрд┐рди рд╡реЗ рд╣рд░ рдмрд╛рд░ рдареАрдХ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

рдЬрдм рдХреЛрдИ рдХрдиреЗрдХреНрд╢рди рд╕рдордп рдкрд░ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛ рддреЛ рдХреНрдпрд╛ рдХреНрдиреЗрдХреНрд╕ рдиреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрддрд╛рд░ рдмрдирд╛рдИ рд╣реИ? рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдЧреИрд░-рдЯреАрдПрдХреНрд╕ рдХреНрд╡реЗрд░реА рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд▓реЗрдирджреЗрди рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рдЙрджрд╛рд╣рд░рдг рдХреНрдпреЛрдВ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ?

рдпрд╛ Knex рдХрд┐рд╕реА рднреА рддрд░рд╣ рдПрдХ рдХрдиреЗрдХреНрд╢рди рдкрд░ рдХрдИ рд╕рдорд╡рд░реНрддреА рд▓реЗрдирджреЗрди рдорд▓реНрдЯреАрдкреНрд▓реЗрдХреНрд╕ рдХрд░рддрд╛ рд╣реИ?

рдпрд╛ рдХреНрдиреЗрдХреНрд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ 2, 3, рдФрд░ 4 рд╡реЗрдВ рдЖрд╣реНрд╡рд╛рди рдкрд░ рдЙрдк-рд▓реЗрдирджреЗрди рдмрдирд╛ рд░рд╣рд╛ рд╣реИ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдпрд╣ рд╢рд╛рдпрдж рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо рджреЗрдЧрд╛ ...

@odgity рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд╛рдЗрдб рдбреЗрдбрд▓реЙрдХ рд╣реИ (рдЖрдкрдХрд╛ рдРрдк рдХрдиреЗрдХреНрд╢рди рдФрд░ рдЕрдзрд┐рдЧреНрд░рд╣рдг рдХрд░рдиреЗ рдХреЗ рдЗрдВрддрдЬрд╛рд░ рдореЗрдВ рдлрдВрд╕ рдЧрдпрд╛ рд╣реИ)ред

рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рд░ рдХреЛрдИ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд░реНрдпрд╛рдкреНрдд рдкрд░реАрдХреНрд╖рдг рд╣реИрдВ рдЬреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдпрд╛ рдЖрдкрдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдмрд╣реБрдд рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдЕрдзрд┐рдЧреНрд░рд╣рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рднреА рдЯреНрд░рд┐рдЧрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдПрдХрд▓ рдХрдиреЗрдХреНрд╢рди рдореЗрдВ рдорд▓реНрдЯреАрдкреНрд▓реЗрдХреНрд╕рд┐рдВрдЧ рд▓реЗрдирджреЗрди рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд▓реЗрдирджреЗрди рдХреЛ рд▓реЗрдирджреЗрди рдХреЗ рдЕрдВрджрд░ рд╕реЗрд╡рдкреЙрдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдиреЗрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдкреВрд▓ рд╕реЗ рдирдпрд╛ рд▓реЗрди-рджреЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдпрд╛ рддреЛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдзрдиреНрдпрд╡рд╛рдж, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдЕрднреА рднреА рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЙрд▓рдЭрди рдореЗрдВ рд╣реВрдВ рдХрд┐ рдЦреБрд▓реЗ рд▓реЗрдирджреЗрди рджреНрд╡рд╛рд░рд╛ рдХрдиреЗрдХреНрд╢рди рд▓реЗрдиреЗ рдкрд░ рдХреНрд╡реЗрд░реА рд▓реЙрдХ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рджреВрд╕рд░реЗ рдирдП рд▓реЗрдирджреЗрди рдХреЛ рдЦреЛрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдзреИрд░реНрдпрдкреВрд░реНрд╡рдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдкреВрд░рд╛ рд╣реЛрддрд╛ рд╣реИред

DEBUG = knex: * рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рдХреЛрдб рдЪрд▓рд╛рдПрдБ рдФрд░ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдкреВрд▓ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред рдХреНрдиреЗрдХреНрд╕ рдХреЛ рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рднреА рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХрд┐ "рдореБрдЭреЗ рдХрдиреЗрдХреНрд╢рди рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрд╛" рдЯрд╛рдЗрдордЖрдЙрдЯ рд╣реЛред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдкрдХрд╛ рд▓реЗрди-рджреЗрди рджреВрд╕рд░рд╛ рдХрдиреЗрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдпрд╣ рдЖрд╡реЗрджрди рд╕реНрддрд░ рдХрд╛ рдЧрддрд┐рд░реЛрдз рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рджреЛрдиреЛрдВ рдХрдиреЗрдХреНрд╢рди рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдЖрдкрдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ)ред

рдореБрдЭреЗ рдпрд╣ рдзрд╛рдЧрд╛ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд▓рдЧрд╛ред рдпрд╣ рджреЗрдЦрдХрд░ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреНрдп рд▓реЛрдЧ рднреА рдЯреЗрд╕реНрдЯ рд▓рд┐рдЦрдиреЗ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╕рд┐рд╕реНрдЯрдо рд░рд╛рдЬреНрдп рдХреЛ рдкреНрд░рджреВрд╖рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╢реБрд░реВ рдХреА рдЬреЛ рд▓реЛрдЧреЛрдВ рдХреЛ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ рдЬреЛ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд░реЛрд▓рдмреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

https://github.com/bas080/knest

@ bas080 рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ, рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЙрди рдЪреАрдЬреЛрдВ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдкрд░реАрдХреНрд╖рдг рдХреЛ рдХреЗрд╡рд▓ рдПрдХрд▓ рд▓реЗрдирджреЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ)ред рдпрд╣ рдХрдИ рдХреЛрдб / рд╕рдорд╡рд░реНрддреА рд▓реЗрдирджреЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдХреЛ рд░реЛрдХ рджреЗрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреЛрдИ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдирд┐рд╣рд┐рдд рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмрд╣реБрдд рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдирд╣реАрдВ) рдЗрд╕ рддрд░рд╣ рд╕реЗред

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж рд░рд╛рдЬреНрдп рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрди-рджреЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рд╣реИ, рдореИрдВ рдЬрд┐рд╕ рдЪреАрдЬ рдкрд░ рдЬреЛрд░ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдЙрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдЪреАрдЬ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред

рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рдж рдпрд╛ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреБрдЫ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдмрд╛рдж рдбреАрдмреА рдХреЛ рд░реМрдВрджрдирд╛ рдФрд░ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬреЛ рдПрдХ-рджреВрд╕рд░реЗ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИрдВ (рдХреБрдЫ рд╕рдордп рдореИрдВ рдкреНрд░рджрд░реНрд╢рди рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдпрджрд┐ рдЖрдмрд╛рджреА 50ms рд╕реЗ рдЕрдзрд┐рдХ рд▓рдВрдмреА рд╣реЛ рдЬрд╛рддреА рд╣реИ)ред

рд╣рд╛рдп, рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдЬреЛ рдирдХрд▓реА рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрдИ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП knex рдХреЗ рд▓рд┐рдП рдПрдХ cli рд╣реИ, _ рдореИрдВ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдЖрдк рдЗрд╕реЗ рджреЗрдЦреЗрдВ рдФрд░ рдХреБрдЫ рдпреЛрдЧрджрд╛рди рдХреЗ рд╕рд╛рде рдореЗрд░реА рдорджрдж рдХрд░реЗрдВ

рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХреЗрд╡рд▓ рдЬрд╛рдБрдЪ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдореЗрд░реЗ SQL рд░реИрдкрд░ рд╕реЗ Knex рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреНрд╡реЗрд░реАрдЬрд╝ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рд╣реИрдВ, рдХреНрд╡реЗрд░реА рдЪреЗрди рдХреЗ рдЕрдВрдд рдореЗрдВ toString() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдКрдкрд░ рджреА рдЧрдИ рд░рдгрдиреАрддрд┐ рдХреЛ рдирд┐рдпреЛрдЬрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ - рд╡рд╣ рд╣реИ: рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдкрд╣рд▓реЗ рд░реЛрд▓рдмреИрдХ -> рдорд╛рдЗрдЧреНрд░реЗрдЯ -> рдмреАрдЬред рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдмреАрдЬ рдбреЗрдЯрд╛ рдХреЛ рдЫреЛрдЯрд╛ рдирд╣реАрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдмрд╣реБрдд рдХрдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╡рд╣ рдЪрдХреНрд░ рд╣реИ: рд░реЛрд▓рдмреИрдХ -> рдорд╛рдЗрдЧреНрд░реЗрдЯ -> рдмреАрдЬ, рд╣рд░ рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдкрд╣рд▓реЗред

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдмреБрд░рд╛ рддрд░реАрдХрд╛ рд╣реИред рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реИрдХрдбрд╝реЛрдВ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдмрд╣реБрдд рдзреАрдореА рдЧрддрд┐ рд╕реЗ рд╣реЛрддрд╛ рд╣реИред рдЖрдкрдХреЛ рд╕рдВрдкреВрд░реНрдг рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдлрд┐рд░ рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдкрд╣рд▓реЗ рдмрд╕ рд╕рднреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдХрд╛рдЯ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдкрд░реАрдХреНрд╖рдг рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдХреЛ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд░реЛрд▓рд┐рдВрдЧрдмреИрдХ / рдкреВрд░реЗ рд╕реНрдХреАрдорд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 100x рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЖрдк рд╕рднреА рдЯреЗрдмрд▓реЛрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд╛рдЯ -рдЫрд╛рдБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

knexCleaner
    .clean(knex, { ignoreTables: ['knex_migrations', 'knex_migrations_lock'] })
    .then(() => knex.seed.run())

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдЯреЗрд╕реНрдЯ рд╕реВрдЯ рд░рди рдХреЗ рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдЪрд▓рд╛ рд░рд╣реЗ рд╣реИрдВ рддреЛ ignoreTables рднрд╛рдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рддрднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬрдм рдЖрдк рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдЪрд▓рд╛рддреЗ рд╣реИрдВред

@ricardograca рдХреНрдпрд╛ рдпрд╣ рд╡рд┐рджреЗрд╢реА рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдорд╛рдорд▓реЛрдВ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ? (рдорддрд▓рдм рд╕рдлрд╛рдИ рд╡рд┐рдлрд▓ рдирд╣реАрдВ рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдЖрджреЗрд╢ рдЧрд▓рдд рд╣реИ)

рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЗрд╕реЗ рдареАрдХ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ (рдмрд╕ рдПрдХ рд╣реА рдкреНрд░рд╢реНрди рдХреЗ рд╕рд╛рде рд╕рднреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ) :)

@elhigu рдЖрдк рдРрд╕рд╛ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣: https://github.com/Vincit/knex-db-manager/blob/master/lib/PostgresDatabaseManager.js#L95

@kibertoad рд╣рд╛рдВ, рдпрд╣ рд╡рд┐рджреЗрд╢реА рдкреНрд░рдореБрдЦ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдм рдХреБрдЫ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред

@odigity рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдо рдЙрд╕ рддрд░рд╣ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ:

// controller.js
const users = require('./usersModel.js');

module.exports.addUser = async ({ token, user }) => {
  // check token, or other logic
  return users.add(user);
};

// usersModel.js
const db = require('./db');

module.exports.add = async user => db('users').insert(user);

// db.js
module.exports = require('knex')({ /* config */});

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреНрд╡реЗрд░реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП trx ) рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреНрд╡реЗрд░реА рдмрд┐рд▓реНрдбрд░реЛрдВ рдореЗрдВ рд▓реЗрдирджреЗрди рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
https://knexjs.org/#Builder -transacting

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд╣реА рддрд░реАрдХрд╛ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

  1. beforeEach рдореЗрдВ trx рдмрдирд╛рдПрдБред
  2. рдХрд┐рд╕реА рддрд░рд╣ рдЗрд╕реЗ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реЗрдВред рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ require('./db') рд╕реЙрд▓реНрдб рд░рд┐рдЯрд░реНрди рдЯреНрд░рдХреНрд╕ рдореВрд▓реНрдпред
  3. рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВред
  4. рд░реЛрд▓рдмреИрдХ рдЯреНрд░рд┐рдХреНрд╕ 'afterEach' рдореЗрдВред

рд▓реЗрдХрд┐рди, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЬреНрдЮрд╛рдд рд╣реИ?
рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдХреЛрдб antoher рд▓реЗрдирджреЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ?

рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк: рд╢рд╛рдпрдж рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдХреНрд╡реЗрд░реА рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдЯреЗрд╕реНрдЯ рдЯреНрд░рд╛рдВрдЬреЗрдХреНрд╢рди рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдкрдврд╝рдиреЗ рдХреЗ рдПрдХ рджрд┐рди рдХреЗ рдмрд╛рдж knex рдХреЛрдб рдореИрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдХреЛрд╢рд┐рд╢:

test.beforeEach(async t => {
    // if we use new 0.17 knex api knex.transaction().then - we can not handle rollback error
    // so we need to do it in old way
    // and add empty .catch to prevent unhandled rejection
    t.context.trx = await new Promise(resolve => db.transaction(trx => resolve(trx)).catch(() => {}));
    t.context.oldRunner = db.client.runner;
    db.client.runner = function(builder) {
        return t.context.oldRunner.call(t.context.trx.client, builder);
    };
    t.context.oldRaw = db.raw;
    db.raw = function(...args) {
        return t.context.oldRaw.call(this, ...args).transacting(t.context.trx);
    };
});

test.afterEach(async t => {
    db.raw = t.context.oldRaw;
    db.client.runner = t.context.oldRunner;
    await t.context.trx.rollback();
});

рдФрд░ рдпрд╣ рдереЛрдбрд╝реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореИрдВ .raw рдФрд░ .client.runner рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реВрдВред .client.runner рдХреЙрд▓ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЬрдм рдЖрдк .then рдПрдХ рдХреНрд╡реЗрд░реА рдмрд┐рд▓реНрдбрд░ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдХрд╛рд░реНрдп рдореЗрдВ db рдХреН knex({ /* config */}) рдХреН

@ рдирд┐рдХреНрд▓реЗрд╡ рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рд╣реИ; рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрдирджреЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдПрдХ рд╡рд┐рд░реЛрдзреА рдкреИрдЯрд░реНрди рдХреЗ рд░реВрдк рдореЗрдВ рднреА рд╕рдордЭреВрдВрдЧрд╛ред рддреЛ knex internals рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рд░рд╣рд╛ рд╣реИред рд╣рд░ рдкрд░реАрдХреНрд╖рдг рдкрд░ рдпрд╛ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП Truncate + repopulate db рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдпрдереЛрдЪрд┐рдд рдЖрдХрд╛рд░ рд╣реИ, рддреЛ рдпрд╣ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдирд╣реАрдВ рд▓реЗрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

zettam picture zettam  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

npow picture npow  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

rarkins picture rarkins  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

arconus picture arconus  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mishitpatel picture mishitpatel  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ