Мантиқи тиҷорат дар пойгоҳи додаҳо бо истифода аз SchemaKeeper

Мақсади ин мақола истифодаи намунаи китобхона аст нигаҳбони схема асбобҳоеро нишон диҳед, ки метавонанд раванди таҳияи пойгоҳи додаҳоро дар доираи лоиҳаҳои PHP бо истифода аз DBMS PostgreSQL ба таври назаррас содда кунанд.

Маълумоти ин мақола, пеш аз ҳама, барои таҳиягароне муфид хоҳад буд, ки мехоҳанд аз қобилиятҳои PostgreSQL бештар истифода баранд, аммо бо мушкилоти нигоҳ доштани мантиқи тиҷорӣ, ки дар пойгоҳи додаҳо ҷойгир шудаанд, дучор меоянд.

Ин мақола афзалиятҳо ё нуқсонҳои нигоҳ доштани мантиқи тиҷоратро дар пойгоҳи додаҳо тавсиф намекунад. Тахмин меравад, ки интихоб аллакай аз ҷониби хонанда анҷом дода шудааст.

Саволҳои зерин баррасӣ карда мешаванд:

  1. Дар кадом шакл партовҳои сохтори пойгоҳи додаҳо бояд дар системаи идоракунии версия нигоҳ дошта шаванд (минбаъд VCS)
  2. Чӣ гуна тағиротро дар сохтори пойгоҳи додаҳо пас аз захира кардани партов пайгирӣ кардан мумкин аст
  3. Чӣ гуна тағиротро дар сохтори пойгоҳи додаҳо ба муҳитҳои дигар бидуни низоъ ва файлҳои азими муҳоҷират интиқол додан мумкин аст
  4. Чӣ тавр ташкил кардани раванди кори мувозӣ дар лоиҳа аз ҷониби якчанд таҳиягарон
  5. Чӣ гуна бояд тағироти бештарро дар сохтори пойгоҳи додаҳо дар муҳити истеҳсолӣ бехатар ҷойгир кард

    SchemaKeeper ки барои кор бо расмиёти захирашуда бо забон навишта шудааст PL/pgSQL. Санҷиш бо забонҳои дигар гузаронида нашудааст, аз ин рӯ истифодаи он метавонад самаранок набошад ё имконнопазир бошад.

Чӣ тавр нигоҳ доштани партови сохтори пойгоҳи додаҳо дар VCS

китобхона нигаҳбони схема функсия таъмин менамояд saveDump, ки сохтори ҳамаи объектҳоро аз базаи маълумот ҳамчун файлҳои матнии алоҳида нигоҳ медорад. Натиҷа як феҳристи дорои сохтори пойгоҳи додаҳо мебошад, ки ба файлҳои гурӯҳбандӣ тақсим карда мешавад, ки онҳоро ба VCS ба осонӣ илова кардан мумкин аст.

Биёед бо истифода аз якчанд мисол табдил додани объектҳоро аз пойгоҳи додаҳо ба файлҳо бубинем:

Навъи объект
Нақшаи
Title
Роҳи нисбии файл

мизи
умумӣ
суратҳисобҳои
./public/tables/accounts.txt

Тартиби захирашуда
умумӣ
auth (хэш bigint)
./public/functions/auth(int8).sql

Муқаддима
брон
тарифҳо
./booking/views/tariffs.txt

Мундариҷаи файлҳо тасвири матнии сохтори объекти мушаххаси пойгоҳи додаҳо мебошанд. Масалан, барои расмиёти захирашуда, мундариҷаи файл таърифи пурраи тартиби нигоҳ дошта мешавад, аз блок сар карда. CREATE OR REPLACE FUNCTION.

Тавре ки аз ҷадвали боло дида мешавад, роҳ ба файл маълумотро дар бораи намуд, схема ва номи объект нигоҳ медорад. Ин равиш паймоишро тавассути партовҳо ва баррасии кодҳои тағирот дар пойгоҳи додаҳо осонтар мекунад.

Васеъ .sql барои файлҳои дорои коди сарчашмаи расмиёти захирашуда, ин интихоб шудааст, то IDE ҳангоми кушодани файл асбобҳоро барои ҳамкорӣ бо пойгоҳи додаҳо ба таври худкор таъмин намояд.

Чӣ гуна тағиротро дар сохтори пойгоҳи додаҳо пас аз захира кардани партов пайгирӣ кардан мумкин аст

Бо захира кардани партови сохтори мавҷудаи пойгоҳи додаҳо дар VCS, мо имкон дорем тафтиш кунем, ки оё пас аз эҷоди партов ба сохтори пойгоҳи додаҳо тағирот ворид карда шудааст. Дар китобхона нигаҳбони схема барои ошкор кардани тағирот дар сохтори пойгоҳи додаҳо, функсия пешбинӣ шудааст 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 тағиротро ба таври худкор татбиқ карда наметавонад. Масалан, агар функсияи триггер, ки ҳадди аққал як триггер истифода мешавад, хориҷ карда шавад. Чунин ҳолатҳо ба таври дастӣ бо истифода аз файлҳои муҳоҷират ҳал карда мешаванд.

Агар шумо барои интиқоли тағирот ба расмиёти захирашуда масъул бошед нигаҳбони схема, пас файлҳои муҳоҷират бояд барои интиқоли дигар тағйирот дар сохтор истифода шаванд. Масалан, китобхонаи хуб барои кор бо муҳоҷирон аст доктрина/мухочират.

Муҳоҷират бояд пеш аз оғози кор татбиқ карда шавад 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 версияи худии партовҳоро дар бар мегирад ва ҳангоми якҷоя кардани филиалҳо партовҳо якҷоя карда мешаванд. Дар аксари мавридҳо, пас аз якҷоякунӣ ягон амали иловагӣ лозим нест, аммо агар тағирот дар шохаҳои гуногун, масалан, ба як ҷадвал ворид карда шуда бошад, метавонад ихтилоф ба миён ояд.

Биёед вазъияти конфликтро бо мисол дида бароем: шоха вуҷуд дорад инкишоф, ки аз он ду шоха шоха дорад: хусусият1 и хусусият2, ки бо онхо ихтилоф надоранд инкишоф, балки бо якдигар ихтилоф доранд. Вазифа аз он иборат аст, ки ҳарду филиалро ба ҳам муттаҳид созем инкишоф. Барои ин, тавсия дода мешавад, ки аввал яке аз шохаҳоро ба он якҷоя кунед инкишофва сипас якҷоя кунед инкишоф ба шохаи боқимонда, ҳалли низоъҳо дар шохаи боқимонда ва сипас муттаҳид кардани шохаи охирин инкишоф. Дар марҳилаи ҳалли низоъ, ба шумо лозим меояд, ки файли муҳоҷиратро дар шохаи охирин ислоҳ кунед, то он ба партовҳои ниҳоӣ, ки натиҷаҳои якҷоякуниро дар бар мегирад, мувофиқат кунад.

Чӣ гуна бояд тағироти бештарро дар сохтори пойгоҳи додаҳо дар муҳити истеҳсолӣ бехатар ҷойгир кард

Ба шарофати мавҷудияти партови сохтори пойгоҳи додаҳо дар VCS, имкон медиҳад, ки пойгоҳи додаҳои истеҳсолиро барои мувофиқати дақиқ ба сохтори зарурӣ тафтиш кунед. Ин кафолат медиҳад, ки тамоми тағиротҳое, ки таҳиягарон пешбинӣ кардаанд, бомуваффақият ба базаи истеҳсолӣ интиқол дода мешаванд.

соли DDL дар PostgreSQL аст муомилот, тавсия дода мешавад, ки ба тартиби зерини ҷойгиркунӣ риоя кунед, то дар сурати хатогии ғайричашмдошт, шумо метавонед "бедард" иҷро кунед ROLLBACK:

  1. Оғози транзаксия
  2. Ҳама интиқолҳоро дар транзаксия иҷро кунед
  3. Дар ҳамон транзаксия, иҷро кунед deployDump
  4. Бе анҷом додани транзаксия, иҷро кунед verifyDump. Агар ягон хатогӣ набошад, иҷро кунед COMMIT. Агар хатогиҳо вуҷуд дошта бошанд, иҷро кунед ROLLBACK

Ин қадамҳоро ба осонӣ ба равишҳои мавҷуда барои ҷобаҷогузории барномаҳо, аз ҷумла вақти сифрӣ муттаҳид кардан мумкин аст.

хулоса

Ба шарофати усулҳои дар боло тавсифшуда, имкон дорад, ки иҷрои ҳадди аксарро аз лоиҳаҳои "PHP + PostgreSQL" фишурда, дар ҳоле ки бароҳатии нисбатан ками рушдро дар муқоиса бо татбиқи тамоми мантиқи тиҷорӣ дар коди асосии барнома қурбон кард. Ғайр аз он, коркарди маълумот дар PL/pgSQL аксар вақт шаффофтар менамояд ва нисбат ба ҳамон функсияе, ки дар PHP навишта шудааст, рамзи камтарро талаб мекунад.

Манбаъ: will.com

Илова Эзоҳ