БизнСс-Π»ΠΎΠ³ΠΈΠΊΠ° Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ SchemaKeeper

ЦСль Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ β€” Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ schema-keeper ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ инструмСнты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ сущСствСнно ΠΎΠ±Π»Π΅Π³Ρ‡ΠΈΡ‚ΡŒ процСсс Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ€Π°ΠΌΠΊΠ°Ρ… PHP-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… Π‘Π£Π‘Π” PostgreSQL.

Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΈΠ· этой ΡΡ‚Π°Ρ‚ΡŒΠΈ, Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎ максимуму хотят ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ возмоТности PostgreSQL, Π½ΠΎ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡ‚ΡΡ с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ сопровоТдСния бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ, вынСсСнной Π² Π‘Π”.

Π‘Ρ‚Π°Ρ‚ΡŒΡ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ прСимущСства ΠΈΠ»ΠΈ нСдостатки хранСния бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π±ΠΎΡ€ ΡƒΠΆΠ΅ сдСлан Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΌ.

Π‘ΡƒΠ΄ΡƒΡ‚ рассмотрСны ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ вопросы:

  1. Π’ ΠΊΠ°ΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΄Π°ΠΌΠΏ структуры Π‘Π” Π² систСмС контроля вСрсий (Π΄Π°Π»Π΅Π΅ ΠΏΠΎ тСксту β€” VCS)
  2. Как ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ измСнСния Π² структурС Π‘Π” послС сохранСния Π΄Π°ΠΌΠΏΠ°
  3. Как ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΡ‚ΡŒ измСнСния Π² структурС Π‘Π” Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ окруТСния Π±Π΅Π· ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² ΠΈ гигантских Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΉ
  4. Как Π½Π°Π»Π°Π΄ΠΈΡ‚ΡŒ процСсс ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π°Π΄ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ²
  5. Как бСзопасно Π΄Π΅ΠΏΠ»ΠΎΠΈΡ‚ΡŒ большСС количСство ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² структурС Π‘Π” Π½Π° production-ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅

    SchemaKeeper Π·Π°Ρ‚ΠΎΡ‡Π΅Π½ ΠΏΠΎΠ΄ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹ΠΌΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°ΠΌΠΈ, написанными Π½Π° языкС PL/pgSQL. ВСстированиС с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ языками Π½Π΅ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ, соотвСтствСнно использованиС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒ эффСктивно, Π»ΠΈΠ±ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.

Π’ ΠΊΠ°ΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΄Π°ΠΌΠΏ структуры Π‘Π” Π² VCS

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° schema-keeper прСдоставляСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ saveDump, которая сохраняСт структуру всСх ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΠ· Π‘Π” Π² Π²ΠΈΠ΄Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… тСкстовых Ρ„Π°ΠΉΠ»ΠΎΠ². На Π²Ρ‹Ρ…ΠΎΠ΄Π΅ создаСтся дирСктория, содСрТащая структуру Π‘Π”, Ρ€Π°Π·Π±ΠΈΡ‚ΡƒΡŽ Π½Π° сгруппированныС Ρ„Π°ΠΉΠ»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² VCS.

Рассмотрим ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΠ· Π‘Π” Π² Ρ„Π°ΠΉΠ»Ρ‹ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…:

Π’ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°
Π‘Ρ…Π΅ΠΌΠ°
НазваниС
ΠžΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ

Π’Π°Π±Π»ΠΈΡ†Π°
public
accounts
./public/tables/accounts.txt

Π₯ранимая ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°
public
auth(hash bigint)
./public/functions/auth(int8).sql

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅
booking
tariffs
./booking/views/tariffs.txt

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΡ‹ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠ² являСтся тСкстовоС прСдставлСниС структуры ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π‘Π”. НапримСр, для Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Ρ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ содСрТимым Ρ„Π°ΠΉΠ»Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰Π΅Π΅ΡΡ с Π±Π»ΠΎΠΊΠ° CREATE OR REPLACE FUNCTION.

Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π²Ρ‹ΡˆΠ΅, ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ Ρ…Ρ€Π°Π½ΠΈΡ‚ Π² сСбС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΈΠΏΠ΅, схСмС ΠΈ названию ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΎΠ±Π»Π΅Π³Ρ‡Π°Π΅Ρ‚ Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΡŽ ΠΏΠΎ Π΄Π°ΠΌΠΏΡƒ ΠΈ code review ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Π‘Π”.

Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ .sql для Ρ„Π°ΠΉΠ»ΠΎΠ² с исходным ΠΊΠΎΠ΄ΠΎΠΌ Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Ρ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ Π²Ρ‹Π±Ρ€Π°Π½ΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ IDE автоматичСски прСдоставляли инструмСнты ΠΏΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΈΡŽ с Π‘Π” ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ Ρ„Π°ΠΉΠ»Π°.

Как ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ измСнСния Π² структурС Π‘Π” послС сохранСния Π΄Π°ΠΌΠΏΠ°

Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΠ² Π΄Π°ΠΌΠΏ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ структуры Π‘Π” Π² VCS, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ вносились Π»ΠΈ измСнСния Π² структуру Π±Π°Π·Ρ‹ послС создания Π΄Π°ΠΌΠΏΠ°. Π’ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ schema-keeper для выявлСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ структуры Π‘Π” прСдусмотрСна функция verifyDump, которая Π±Π΅Π· ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ различиях.

ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ способ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ β€” ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ saveDump, ΡƒΠΊΠ°Π·Π°Π² Ρ‚Ρƒ ΠΆΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ, ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π² VCS Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. Π’Π°ΠΊ ΠΊΠ°ΠΊ всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠ· Π‘Π” сохранСны Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ…, Ρ‚ΠΎ VCS ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ измСнившиСся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹.
Π“Π»Π°Π²Π½Ρ‹ΠΉ минус Π΄Π°Π½Π½ΠΎΠ³ΠΎ способа β€” Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ пСрСзаписи Ρ„Π°ΠΉΠ»ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ измСнСния.

Как ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΡ‚ΡŒ измСнСния Π² структурС Π‘Π” Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ окруТСния Π±Π΅Π· ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² ΠΈ гигантских Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΉ

Благодаря Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ deployDump исходный ΠΊΠΎΠ΄ Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Ρ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ исходный ΠΊΠΎΠ΄ прилоТСния. МоТно Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ/ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ строки Π² ΠΊΠΎΠ΄Π΅ Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Ρ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ ΠΈ сразу ΠΆΠ΅ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ измСнСния Π² систСму контроля вСрсий, ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ/ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΏΡƒΡ‚Π΅ΠΌ создания/удалСния ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ² Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ с Π΄Π°ΠΌΠΏΠΎΠΌ.

НапримСр, для создания Π½ΠΎΠ²ΠΎΠΉ Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Π² схСмС public достаточно ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ» с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ .sql Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ public/functions, ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² Π½Π΅Π³ΠΎ исходный ΠΊΠΎΠ΄ Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π±Π»ΠΎΠΊ CREATE OR REPLACE FUNCTION, Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ deployDump. Аналогично происходит ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠΎΠ΄ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ ΠΈ Π² VCS, ΠΈ Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ….

Если Π² исходном ΠΊΠΎΠ΄Π΅ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ появится ошибка, Π»ΠΈΠ±ΠΎ нСсоотвСтствиС ΠΌΠ΅ΠΆΠ΄Ρƒ названиями Ρ„Π°ΠΉΠ»Π° ΠΈ Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, Ρ‚ΠΎ deployDump Π½Π΅ выполнится, ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΠ² тСкст ошибки. РассогласованиС Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Ρ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ ΠΌΠ΅ΠΆΠ΄Ρƒ Π΄Π°ΠΌΠΏΠΎΠΌ ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π‘Π” Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈ использовании deployDump.

ΠŸΡ€ΠΈ создании Π½ΠΎΠ²ΠΎΠΉ Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Π½Π΅Ρ‚ нСобходимости Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π°. Достаточно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρƒ Ρ„Π°ΠΉΠ»Π° Π±Ρ‹Π»ΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ .sql. ПослС Π²Ρ‹Π·ΠΎΠ²Π° deployDump тСкст ошибки Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для пСрСимСнования Ρ„Π°ΠΉΠ»Π°.

deployDump позволяСт ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… дСйствий, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ классичСском ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹Π»ΠΎ Π±Ρ‹
сначала Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ DROP FUNCTION, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌ CREATE OR REPLACE FUNCTION.

К соТалСнию, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ситуации, ΠΊΠΎΠ³Π΄Π° deployDump Π½Π΅ Π² состоянии автоматичСски ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ измСнСния. НапримСр, Ссли удаляСтся триггСрная функция, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ хотя Π±Ρ‹ ΠΎΠ΄Π½ΠΈΠΌ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ΠΎΠΌ. Π’Π°ΠΊΠΈΠ΅ ситуации Ρ€Π΅ΡˆΠ°ΡŽΡ‚ΡΡ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΉ.

Если Π·Π° пСрСнос ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Ρ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°Ρ… ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ сам schema-keeper, Ρ‚ΠΎ для пСрСноса ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² структурС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΉ. НапримСр, Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с миграциями являСтся doctrine/migrations.

ΠœΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π΄ΠΎ запуска deployDump. Π­Ρ‚ΠΎ позволяСт Π²Π½ΠΎΡΠΈΡ‚ΡŒ всС измСнСния Π² структуру ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½Ρ‹Π΅ ситуации, Ρ‡Ρ‚ΠΎΠ±Ρ‹ измСнСния Π² Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Ρ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°Ρ… Π² послСдствии ΠΏΠ΅Ρ€Π΅Π½Π΅ΡΠ»ΠΈΡΡŒ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π° с миграциями Π±ΡƒΠ΄Π΅Ρ‚ описана Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ….

Как Π½Π°Π»Π°Π΄ΠΈΡ‚ΡŒ процСсс ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π°Π΄ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ²

НСобходимо ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ скрипт ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π‘Π”, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ Π½Π° своСй Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ машинС, приводя структуру локальной Π‘Π” Π² соотвСтствиС с сохранСнным Π² VCS Π΄Π°ΠΌΠΏΠΎΠΌ. ΠŸΡ€ΠΎΡ‰Π΅ всСго Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ локальной Π‘Π” Π½Π° 3 шага:

  1. Π˜ΠΌΠΏΠΎΡ€Ρ‚ Ρ„Π°ΠΉΠ»Π° с Π±Π°Π·ΠΎΠ²ΠΎΠΉ структурой, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, base.sql
  2. ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΉ
  3. Π’Ρ‹Π·ΠΎΠ² deployDump

base.sql β€” это отправная Ρ‚ΠΎΡ‡ΠΊΠ°, ΠΏΠΎΠ²Π΅Ρ€Ρ… ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ ΠΈ выполняСтся deployDump, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ base.sql + ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ + deployDump = Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ структура Π‘Π”. Π‘Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ Ρ„Π°ΠΉΠ» ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ pg_dump. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ base.sql ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… с нуля.

НазовСм скрипт ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π‘Π” refresh.sh. Π Π°Π±ΠΎΡ‡ΠΈΠΉ процСсс ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

  1. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ запускаСт Π² своСм ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ refresh.sh ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ структуру Π‘Π”
  2. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π½Π°Π΄ поставлСнной Π·Π°Π΄Π°Ρ‡Π΅ΠΉ, модифицируя Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ Π‘Π” ΠΏΠΎΠ΄ Π½ΡƒΠΆΠ΄Ρ‹ Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π° (ALTER TABLE ... ADD COLUMN ΠΈ Ρ‚Π΄)
  3. ПослС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ saveDump, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² VCS измСнСния, сдСланныС Π² Π‘Π”
  4. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ запускаСт refresh.sh, Π·Π°Ρ‚Π΅ΠΌ verifyDump, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ список ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡŽ
  5. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ пСрСносит всС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ структуры Π² Ρ„Π°ΠΉΠ» ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ, запускаСт Π΅Ρ‰Π΅ Ρ€Π°Π· refresh.sh ΠΈ verifyDump, ΠΈ, Ссли миграция составлСна ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ, verifyDump ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ отсутствиС Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ локальной Π‘Π” ΠΈ сохранСнным Π΄Π°ΠΌΠΏΠΎΠΌ

ΠžΠΏΠΈΡΠ°Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ процСсс совмСстим с ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌΠΈ gitflow. КаТдая Π²Π΅Ρ‚ΠΊΠ° Π² VCS Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ свою Π²Π΅Ρ€ΡΠΈΡŽ Π΄Π°ΠΌΠΏΠ°, ΠΈ ΠΏΡ€ΠΈ слияниС Π²Π΅Ρ‚ΠΎΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ слияниС Π΄Π°ΠΌΠΏΠΎΠ². Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв послС слияния Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… дСйствий, Π½ΠΎ Ссли Π² Ρ€Π°Π·Π½Ρ‹Ρ… Π²Π΅Ρ‚ΠΊΠ°Ρ… вносились измСнСния, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π² ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚.

Рассмотрим ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π½ΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅: Π΅ΡΡ‚ΡŒ Π²Π΅Ρ‚ΠΊΠ° develop, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΡ‚Π²Π΅Ρ‚Π²Π»Π΅Π½Ρ‹ Π΄Π²Π΅ Π²Π΅Ρ‚ΠΊΠΈ: feature1 ΠΈ feature2, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² с develop, Π½ΠΎ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ собой. Π‘Ρ‚ΠΎΠΈΡ‚ Π·Π°Π΄Π°Ρ‡Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ слияниС ΠΎΠ±Π΅ΠΈΡ… Π²Π΅Ρ‚ΠΎΠΊ Π² develop. Для Ρ‚Π°ΠΊΠΎΠ³ΠΎ случая рСкомСндуСтся сначала Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ слияниС ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π²Π΅Ρ‚ΠΎΠΊ Π² develop, Π° Π·Π°Ρ‚Π΅ΠΌ слияниС develop Π² ΠΎΡΡ‚Π°Π²ΡˆΡƒΡŽΡΡ Π²Π΅Ρ‚ΠΊΡƒ, Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΠ² ΠΏΡ€ΠΈ этом ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ Π² ΠΎΡΡ‚Π°Π²ΡˆΠ΅ΠΉΡΡ Π²Π΅Ρ‚ΠΊΠ΅, послС Ρ‡Π΅Π³ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ слияниС послСднСй Π²Π΅Ρ‚ΠΊΠΈ Π² develop. На этапС Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ придСтся ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ Π² послСднСй Π²Π΅Ρ‚ΠΊΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ соотвСтствовал Ρ„ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΌΡƒ Π΄Π°ΠΌΠΏΡƒ, Π²ΠΊΠ»ΡŽΡ‡ΠΈΠ²ΡˆΠ΅ΠΌ Π² сСбя Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ слияний.

Как бСзопасно Π΄Π΅ΠΏΠ»ΠΎΠΈΡ‚ΡŒ большСС количСство ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² структурС Π‘Π” Π½Π° production-ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅

Благодаря Π½Π°Π»ΠΈΡ‡ΠΈΡŽ Π² VCS Π΄Π°ΠΌΠΏΠ° Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ структуры Π‘Π” появляСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ production-Π±Π°Π·Ρƒ Π½Π° Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ соотвСтствиС Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠΉ структурС. Π­Ρ‚ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π° production-Π±Π°Π·Ρƒ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π½Π΅ΡΠ»ΠΈΡΡŒ всС измСнСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°Π»ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ.

Π’Π°ΠΊ ΠΊΠ°ΠΊ DDL Π² PostgreSQL являСтся Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ, рСкомСндуСтся ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ порядка дСплоя, Ρ‡Ρ‚ΠΎΠ±Ρ‹, Π² случаС Π½Π΅ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄Π΅Π½Π½ΠΎΠΉ ошибки, Β«Π±Π΅Π·Π±ΠΎΠ»Π΅Π·Π½Π΅Π½Π½ΠΎΒ» Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ROLLBACK:

  1. ΠΠ°Ρ‡Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ
  2. Π’ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ всС ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ
  3. Π’ этой ΠΆΠ΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ deployDump
  4. НС Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ verifyDump. Если ошибок Π½Π΅Ρ‚, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ COMMIT. Если ошибки Π΅ΡΡ‚ΡŒ, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ROLLBACK

Π”Π°Π½Π½Ρ‹Π΅ шаги достаточно Π»Π΅Π³ΠΊΠΎ Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ ΠΊ дСплою ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π² Ρ‚ΠΎΠΌ числС zero-downtime.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Благодаря Π²Ρ‹ΡˆΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½Ρ‹ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΆΠΈΠΌΠ°Ρ‚ΡŒ максимум ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈΠ· Β«PHP + PostgreSQLΒ» ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ², ТСртвуя ΠΏΡ€ΠΈ этом ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ нСбольшим количСством удобства Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π² сравнСнии с Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ всСй бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ Π² основном ΠΊΠΎΠ΄Π΅ прилоТСния. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… Π² PL/pgSQL часто выглядит Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎ ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ мСньшСго количСства ΠΊΠΎΠ΄Π°, Ρ‡Π΅ΠΌ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π», написанный Π½Π° PHP.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ