Qëllimi i këtij artikulli është të tregojë, përmes bibliotekës mjetet që lehtësojnë ndjeshëm procesin e zhvillimit të bazave të të dhënave në projektet PHP që përdorin DBMS PostgreSQL.
Informacioni në këtë artikull do të jetë sidomos i dobishëm për zhvilluesit që dëshirojnë të shfrytëzojnë sa më shumë mundësitë e PostgreSQL, por hasin vështirësi në mbështetje të logjikës së biznesit të outsourcuara në DB.
Artikulli nuk do të përshkruajë përparësitë ose disavantazhet e ruajtjes së logjikës së biznesit në bazën e të dhënave. Supozohet se zgjedhja është bërë nga lexuesi.
Do të shqyrtohen pyetje të tilla si:
- Në cilën formë të ruhet dumpsi i strukturës së DB në sistemin e kontrollit të versioneve (VCS)
- Si të ndjekim ndryshimet në strukturën e DB pas ruajtjes së dumpsit
- Si të transferojmë ndryshimet në strukturën e DB në mjedise të tjera pa konflikte dhe skedarë migracionesh gjigande
- Si të organizojmë procesin e punës paralele mbi projektin me disa zhvillues
- Si të deployohet në siguri një numër të madh ndryshimesh në strukturën e DB në ambientin production
SchemaKeeper është i optimizuar për punë me procedurat e ruajtura të shkruara në gjuhën . Testimi me gjuhë të tjera nuk është kryer, për pasojë përdorimi mund të mos jetë kaq efektiv, ose të jetë i pamundur.
Në cilën formë të ruhet dumpsi i strukturës së DB në VCS
Biblioteka ofron funksionin saveDump, i cili ruan strukturën e të gjithë objekteve nga DB si skedarë të veçantë tekstualë. Në përfundim krijohet një direktorium që përmban strukturën e DB, e cila është e ndarë në skedarë të grupuar që lehtë mund të shtohen në VCS.
Le të shqyrtojmë transformimin e objekteve nga DB në skedarë përmes disa shembujsh:
Tipi i objektit
Skema
Emri
Rruga e relatshme drejt skedarit
Tavolina
public
accounts
./public/tables/accounts.txt
Procedura e ruajtur
public
auth(hash bigint)
./public/functions/auth(int8).sql
Përfaqësimi
booking
tariffs
./booking/views/tariffs.txt
Përmbajtja e skedarëve është një përfaqësim të tekstit të strukturës së objektit të caktuar të DB. Për shembull, për procedurat e ruajtura, përmbajtja e skedarit do të jetë definicioni i plotë i procedurës së ruajtur, që fillon me bllokun CREATE OR REPLACE FUNCTION.
Siç shihet nga tabela e mësipërme, rruga e skedarit mban informacionin për tipin, skemën dhe emrin e objektit. Kjo qasje lehtëson navigimin në dumps dhe shqyrtimin e ndryshimeve në DB.
Zgjerim
.sqlpër skedarët me kodin burimor të procedurave të ruajtura, është zgjedhur që IDE të ofrojnë automatikisht mjete për ndërveprimin me Baza të Dhënash kur hapet skedari.
Si të ndjekim ndryshimet në strukturën e DB pas ruajtjes së dumpsit
Duke ruajtur dump-in e strukturës aktuale të Baza të Dhënash në VCS, ne marrim mundësinë për të verifikuar nëse janë bërë ndryshime në strukturën e bazës pas krijimit të dump-it. Në bibliotekën për identifikimin e ndryshimeve në strukturën e Baza të Dhënash është parashikuar funksioni verifyDump, i cili pa efekte anësore kthen informacion mbi ndryshimet.
Një mënyrë alternative verifikimi është të thërrasësh përsëri funksionin saveDump, duke treguar të njëjtën drejtorinë, dhe të kontrollosh në VCS për ndryshime. Ngjashëm me që të gjitha objektet nga Baza të Dhënash janë ruajtur në skedarë të veçantë, VCS do të tregojë vetëm objektet e ndryshuara.
Disavantazhi kryesor i kësaj metode është se duhet të ri-shkruhen skedarët për të parë ndryshimet.
Si të transferojmë ndryshimet në strukturën e DB në mjedise të tjera pa konflikte dhe skedarë migracionesh gjigande
Falë funksionit deployDump kodi burimor i procedurave të ruajtura mund të redaktohet në mënyrë të njëjtë siç bëhet me kodin e zakonshëm të aplikacionit. Mund të shtohen/faqen rreshta të rinj në kodin e procedurave të ruajtura dhe menjëherë të dërgohen ndryshimet në sistemin e kontrollit të versioneve, ose të krijohen/fshihen procedurat e ruajtura duke krijuar/fshirë skedarët përkatës në drejtorinë e dump-it.
Për shembull, për të krijuar një procedurë të re të ruajtur në skemën public mjafton të krijosh një skedar të ri me shtesën .sql në drejtorinë public/functions, të vendosësh në të kodin burimor të procedurës së ruajtur, duke përfshirë blokun CREATE OR REPLACE FUNCTION, pastaj të thërrasësh funksionin deployDump. Në mënyrë të ngjashme ndodh ndryshimi dhe fshirja e procedurës së ruajtur. Në këtë mënyrë, kodi përfshihet njëkohësisht në VCS dhe në Baza të Dhënash.
Nëse në kodin burimor të ndonjë procedure të ruajtur ndodh një gabim, ose një moskonsistencë mes emrave të skedarëve dhe procedurës së ruajtur, atëherë deployDump nuk do të kryhet, duke treguar tekstin e gabimit. Moskonsistenca e procedurave të ruajtura mes dump-it dhe Baza të Dhënash aktuale është e pamundur kur përdoret deployDump.
Kur krijohet një procedurë e re e ruajtur, nuk është e nevojshme të shkruhet dorazi emri i saktë i skedarit. Mjafton që skedari të ketë shtesën
.sql. Pas thirrjesdeployDumpteksti i gabimit do të përmbajë emrin e saktë, i cili mund të përdoret për të riemëruar skedarin.
deployDump lejon ndryshimin e parametrave të funksionit ose llojit të kthyer pa veprime të tjera, ndërsa sipas qasjes klasike do të duhej
fillimisht të ekzekutonte DROP FUNCTION, dhe vetëm pastaj CREATE OR REPLACE FUNCTION.
Fatkeq, ekzistojnë disa situata kur deployDump nuk është e mundur të aplikohet automatikisht ndryshimet. Për shembull, nëse hiqet një funksion aktivizues që përdoret nga të paktën një aktivizues. Këto situata zgjidhen manualisht përmes skedave të migrimeve.
Nëse transferimin e ndryshimeve në procedurat e ruajtura e bën vetë , atëherë për të transferuar ndryshimet e tjera në strukturë është e nevojshme të përdoren skedat e migrimeve. Për shembull, një bibliotekë e mirë për punën me migrimet është .
Migrimet duhet të aplikohen para se të fillojë deployDump. Kjo lejon që të bëhen të gjitha ndryshimet në strukturë dhe të zgjidhen situatat problematike që të transferohen pa probleme ndryshimet në procedurat e ruajtura më vonë.
Më shumë në detaje, puna me migrimet do të përshkruhet në seksionet në vazhdim.
Si të organizojmë procesin e punës paralele mbi projektin me disa zhvillues
ĂshtĂ« e nevojshme tĂ« krijohet njĂ« skenar i plotĂ« i inicializimit tĂ« DB-sĂ«, i cili do tĂ« ekzekutohet nga zhvilluesi nĂ« makinĂ«n e tij tĂ« punĂ«s, duke e sjellĂ« strukturĂ«n e DB-sĂ« lokale nĂ« pĂ«rputhje me dump-in e ruajtur nĂ« VCS. MĂ« lehtĂ« Ă«shtĂ« tĂ« ndahet inicializimi i DB-sĂ« lokale nĂ« 3 hapa:
- Importimi i skedarit me strukturën bazë, i cili do të quhet, për shembull,
base.sql - Kthimi i migrimeve
- Thirrja
deployDump
base.sqlâ kjo Ă«shtĂ« pika e nisjes, mbi tĂ« cilĂ«n aplikohen migrimet dhe ekzekutohetdeployDump, qĂ« do tĂ« thotĂ«base.sql + migrimet + deployDump = struktura aktuale e DB-sĂ«. NjĂ« skedar tĂ« tillĂ« mund tĂ« formohet pĂ«rmes utilitaritpg_dump. PĂ«rdoretbase.sqlpĂ«r vetĂ« inicializimin e bazĂ«s sĂ« tĂ« dhĂ«nave nga fillimi.
Ta quajmë skenarin e plotë të inicializimit të DB-së refresh.sh. Procesi i punës mund të duket si më poshtë:
- Zhvilluesi ekzekuton në mjedisin e tij
refresh.shdhe merr strukturën aktuale të DB-së - Zhvilluesi fillon të punojë mbi detyrën e caktuar, duke modifikuar DB-në lokale sipas nevojave të funksionalitetit të ri (
ALTER TABLE ... ADD COLUMNetj) - Pas përfundimit të detyrës, zhvilluesi thërret funksionin
saveDump, për të regjistruar në VCS ndryshimet e bëra në DB - Zhvilluesi ekzekuton sërish
refresh.sh, pastajverifyDump, i cili tani tregon listën e ndryshimeve për t'u përfshirë në migrim - Zhvilluesi transferon të gjitha ndryshimet në strukturë në skedarin e migrimit, ekzekuton përsëri
refresh.shdheverifyDump, dhe, nëse migrimi është përgatitur saktë,verifyDumpdo të tregojë se nuk ka dallime midis DB-së lokale dhe dump-it të ruajtur.
Procesi tĂ« pĂ«rshkruar mĂ« sipĂ«r Ă«shtĂ« pĂ«rputhshĂ«m me parimet e gitflow. Ădo degĂ« nĂ« VCS do tĂ« pĂ«rmbajĂ« versionin e vet tĂ« dump-it, dhe kur degĂ«t bashkohen, do tĂ« ndodhĂ« bashkimi i dump-Ă«ve. NĂ« shumicĂ«n e rasteve, pas bashkimit nuk nevojitet tĂ« merren masa tĂ« tjera, por nĂ«se janĂ« bĂ«rĂ« ndryshime nĂ« degĂ« tĂ« ndryshme, pĂ«r shembull, nĂ« tĂ« njĂ«jtĂ«n tabelĂ«, mund tĂ« ndodhi njĂ« konflikt.
Le të shqyrtojmë një situatë konflikti me shembuj: ka një degë develop, nga e cila janë ndarë dy degë: feature1 dhe feature2, të cilat nuk kanë konflikte me develop, por kanë konflikte midis tyre. Detyra është të bëhet bashkimi i të dyve degë në develop. Në këtë rast, rekomandohet së pari të bëhet bashkimi i njërit prej degëve në develop, e më pas bashkimi develop në degën tjetër, duke zgjidhur konflikte në degën e mbetur, dhe më pas të bëhet bashkimi i degës së fundit në develop. Në fazën e zgjidhjes së konflikteve, mund të jetë e nevojshme të korrigjohet skedari i migrimit në degën e fundit, në mënyrë që të përputhej me dump-in përfundimtar, i cili përfshin rezultatet e bashkimeve.
Si të deployohet në siguri një numër të madh ndryshimesh në strukturën e DB në ambientin production
Duke pasur në VCS dump-in e strukturës aktuale të DB-së, krijohet mundësia për të verifikuar bazën e të dhënave në prodhim për përputhshmërinë e saktë me strukturën e kërkuar. Kjo garanton që të gjitha ndryshimet, që kishin parashikuar zhvilluesit, janë transferuar me sukses në bazën e të dhënave në prodhim.
Meqenëse në PostgreSQL është , rekomandohet që të ndiqet rendi i mëposhtëm i depot, në mënyrë që, në rast të një gabimi të papritur, të mund të bëhet një ROLLBACK:
- Të fillojë transaksionin
- Të bëhen të gjitha migrimet në transaksion
- Në këtë transaksion të bëhet
deployDump - Pa përfunduar transaksionin, të bëhet
verifyDump. Nëse nuk ka gabime, të bëhetKREJT. Nëse ka gabime, të bëhetROLLBACK
Këto hapat janë mjaft të lehta për t'u integruar në qasjet ekzistente për depolimin e aplikacioneve, përfshirë zero-downtime.
Përfundim
Falë metodave të përshkruara më sipër, është e mundur të nxjerrim maksimumin e performancës nga projektet "PHP + PostgreSQL", duke sakrifikuar një sasi relativisht të vogël të lehtësisë që ofron zhvillimi krahasuar me realizimin e gjithë logjikës së biznesit në kodin kryesor të aplikacionit. Për më tepër, përpunimi i të dhënave në shpesh duket më transparent dhe kërkon më pak kod sesa funksionaliteti i njëjtë i shkruar në PHP.
Burimi: habr.com
