Selle artikli eesmĂ€rk on nĂ€idata raamatukogu tööriistu, mis vĂ”imaldavad oluliselt lihtsustada andmebaaside arendamise protsessi PHP-projektides, mis kasutavad PostgreSQL andmebaasihaldussĂŒsteemi.
KÀesolevast artiklist on kasu eelkÔige arendajatele, kes soovivad maksimaalselt Àra kasutada PostgreSQLi vÔimalusi, kuid seisavad silmitsi Àriloogika haldamise probleemidega, mis on viidud andmebaasi.
Artikkel ei kÀsitle Àriloogika hoidmise eeliseid vÔi puudusi andmebaasis. Eeldatakse, et lugeja on valiku juba teinud.
KĂ€sitletakse jĂ€rgmisi kĂŒsimusi:
- Kuidas sĂ€ilitada andmebaasi struktuuri varukoopia versioonihaldussĂŒsteemis (edaspidi VCS)
- Kuidas jÀlgida andmebaasi struktuuri muutusi pÀrast varukoopia salvestamist
- Kuidas edastada andmebaasi struktuuri muutusi teistele keskkondadele ilma konfliktideta ja suuremate migratsioonifailideta
- Kuidas korraldada mitme arendaja paralleelset töötamist projekti kallal
- Kuidas turvaliselt juurutada suurem hulk andmebaasi struktuuri muutusi tootmisringkonda
SchemaKeeper on loodud salvestatud protseduuride töötlemiseks, mis on kirjutatud keeles . Testimine teiste keeltest ei ole toimunud, seetÔttu vÔib kasutamine olla vÀhem tÔhus vÔi isegi vÔimatu.
Kuidas salvestada andmebaasi struktuuri dump VCS-is
Raamatukogu pakub funktsiooni saveDump, mis salvestab kĂ”ikide objektide struktuuri andmebaasist eraldi tekstifailidena. Tulemuseks luuakse kataloog, mis sisaldab andmebaasi struktuuri, jagatuna rĂŒhmitatud failideks, mida on lihtne VCS-i lisada.
Vaadata objekti teisendamist andmebaasist failideks mitmete nÀidete abil:
Objekti tĂŒĂŒp
Skeem
Nimi
Faili suhteline tee
Tabel
public
accounts
./public/tables/accounts.txt
Salvestatud protseduur
public
auth(hash bigint)
./public/functions/auth(int8).sql
Vaade
booking
tariffs
./booking/views/tariffs.txt
Failide sisu on objekti andmebaasi struktuuri tekstiline esitus. NÀiteks salvestatud protseduuride puhul on faili sisuks salvestatud protseduuri tÀiendav mÀÀratlemine, mis algab plokist CREATE OR REPLACE FUNCTION.
Nagu nĂ€ha ĂŒlaltoodud tabelist, sisaldab faili tee teavet objekti tĂŒĂŒbi, skeemi ja nime kohta. Selline lĂ€henemine lihtsustab dump'i navigeerimist ja andmebaasi muudatuste arvustamist.
Laiendus
.sqlprotseduuride lÀhtekoodifailide jaoks on valitud, et IDE-d pakuksid automaatselt tööriistu andmebaasi interaktsiooniks faili avamisel.
Kuidas jÀlgida andmebaasi struktuuri muutusi pÀrast varukoopia salvestamist
Salvestades praeguse andmebaasi struktuuri VCS-s, saame kontrollida, kas struktuuri on pÀrast dumpi loomist muudetud. Raamatukogus andmebaasi struktuuri muutuste tuvastamiseks on ette nÀhtud funktsioon verifyDump, mis tagastab ilma kÔrvalmÔjudeta teavet erinevuste kohta.
Alternatiivne kontrollimeetod â kutsuda uuesti vĂ€lja funktsioon saveDump, mĂ€rkides sama katalooge, ja kontrollida VCS-is muudatuste olemasolu. Kuna kĂ”ik andmebaasi objektid on salvestatud eraldi failidesse, nĂ€itab VCS ainult muudetud objekte.
Peamine miinus antud meetodi puhul â failide ĂŒmberkirjutamise vajadus muudatuste nĂ€gemiseks.
Kuidas edastada andmebaasi struktuuri muutusi teistele keskkondadele ilma konfliktideta ja suuremate migratsioonifailideta
TĂ€nu funktsioonile deployDump Salvestatud protseduuride lĂ€htekoodi saab muuta sama lihtsalt nagu tavalise rakenduse lĂ€htekoodi. Uusi koodiridasid saab lisada vĂ”i eemaldada salvestatud protseduuride koodis ning kohe saab saata muudatused versioonihaldussĂŒsteemi vĂ”i luua vĂ”i kustutada salvestatud protseduure, luues vĂ”i kustutades vastavaid faile koopia kaustas.
NÀiteks uue salvestatud protseduuri loomiseks skeemis public on piisav luua uus fail laiendiga .sql kaustas public/functions, asetada sellesse salvestatud protseduuri lÀhtekood, sealhulgas plokk CREATE OR REPLACE FUNCTION, seejÀrel kutsuda vÀlja funktsioon deployDump. Sarnasel viisil toimub salvestatud protseduuri muutmine ja kustutamine. Seega satub kood samal ajal nii VCS-i kui ka andmebaasi.
Kui mÔne salvestatud protseduuri lÀhtekoodis ilmneb viga vÔi tekib vastuolu faili nime ja salvestatud protseduuri vahel, siis deployDump ei toimu, kuvades veateate. Salvestatud protseduuride lahknevus koopia ja praeguse andmebaasi vahel on vÔimatu, kui kasutatakse deployDump.
Uue salvestatud protseduuri loomisel ei ole vaja kÀsitsi sisestada Ôiget faili nime. Piisab, kui failil on laiend
.sql. PĂ€rast vĂ€ljakutsumistdeployDumpveatekst sisaldab Ă”iget nime, mida saab kasutada faili ĂŒmbernimetamiseks.
deployDump vĂ”imaldab muuta funktsiooni vĂ”i tagastatava tĂŒĂŒbi parameetreid ilma tĂ€iendavate toiminguteta, samas kui klassikalise lĂ€henemise korral oleks olnud vajalik
esiteks teostada DROP FUNCTION, ja alles siis CREATE OR REPLACE FUNCTION.
Kahjuks on olukordi, kus deployDump ei ole suuteline automaatselt muudatusi rakendama. NĂ€iteks, kui eemaldatakse kĂ€ivitusfunktsioon, mida kasutab vĂ€hemalt ĂŒks kĂ€ivitus. Sellised olukorrad lahendatakse kĂ€sitsi migratsioonifailide abil.
Kui muutuste eest hĂ€lbivates protseduurides vastutab , siis ĂŒlejÀÀnud struktuuri muudatuste ĂŒleviimiseks tuleb kasutada migratsioonifaile. NĂ€iteks on hea raamatukogu migratsioonide jaoks .
Migratsioonid peavad olema rakendatud enne deployDump. See vĂ”imaldab teha kĂ”ik muudatused struktuuris ja lahendada probleemsed olukorrad, et muudatused hĂ€lbivates protseduurides saaks hiljem probleemideta ĂŒle kanda.
Migratsioonide töö kohta lÀhemalt tuleb juttu jÀrgmistes osades.
Kuidas korraldada mitme arendaja paralleelset töötamist projekti kallal
On oluline luua tÀieliku andmebaasi initsialiseerimise skript, mis kÀivitatakse arendaja oma töökeskkonnas, et viia kohaliku andmebaasi struktuur vastavusse VCS-i salvestatud dumpiga. Lihtsaim on jagada kohaliku andmebaasi initsialiseerimine kolme etappi:
- Importida fail pÔhistruktuuriga, mida saab nÀiteks nimetada
base.sql - Rakendada migratsioone
- Kutse
deployDump
base.sqlâ see on lĂ€htepunt, millele tuginedes rakendatakse migratsioone ja tehaksedeployDump, stbase.sql + migratsioonid + deployDump = ajakohane andmebaasi struktuur. Sellise faili genereerimiseks saab kasutada utiliitipg_dump. Seda kasutataksebase.sqlainult andmebaasi initsialiseerimiseks nullist.
Nimetame tÀieliku andmebaasi initsialiseerimise skripti refresh.sh. Töövoog vÔiks vÀlja nÀha jÀrgmiselt:
- Arendaja kÀivitab oma keskkonnas
refresh.shja saab ajakohase andmebaasi struktuuri - Arendaja hakkab töötama seatud ĂŒlesande kallal, muutes kohaliku andmebaasi vastavalt uue funktsiooni vajadustele (
ALTER TABLE ... ADD COLUMNjne) - PĂ€rast ĂŒlesande tĂ€itmist kutsub arendaja vĂ€lja funktsiooni
saveDump, et fikseerida VCS-is andmebaasis tehtud muudatused - Arendaja kÀivitab uuesti
refresh.sh, seejĂ€relverifyDump, mis nĂŒĂŒd nĂ€itab migratsiooni kaasamise muudatuste loendit - Arendaja viib kĂ”ik struktuuri muutused ĂŒle migratsioonifaili, kĂ€ivitab selle uuesti
refresh.shjaverifyDump, ja kui migratsioon on korrektselt koostatud,verifyDumpnÀitab see erinevuste puudumist kohaliku andmebaasi ja salvestatud dumpi vahel
Ălaltoodud protsess on kooskĂ”las gitflow pĂ”himĂ”tetega. Iga haru VCS-is sisaldab oma dumpi versiooni ning harude sulandumisel toimub dumpide ĂŒhendamine. Enamasti ei ole pĂ€rast sulandumist vaja teha tĂ€iendavaid toiminguid, kuid kui erinevates harudes on tehtud muudatusi, nĂ€iteks samasse tabelisse, vĂ”ib tekkida konflikt.
Vaatame konfliktset olukorda nĂ€itel: on haru develop, millest on vĂ€lja kasvanud kaks haru: feature1 ja feature2, mis ei sisalda konflikte develop, kuid omavad ĂŒksteisega konflikte. Ălesanne on sulandada mĂ”lemad harud develop. Sellisel juhul soovitatakse kĂ”igepealt sulandada ĂŒks harudest develop, seejĂ€rel siis develop jĂ€tta alles haru, lahendades konfliktid seal, pĂ€rast mida sulandada viimane haru develop. Konfliktide lahendamise etapis vĂ”ib olla vajalik migreerimisfaili muutmine viimases haru, et see vastaks lĂ”ppdumpile, mis sisaldab liitumiste tulemusi.
Kuidas turvaliselt juurutada suurem hulk andmebaasi struktuuri muutusi tootmisringkonda
TÀnu VCS-s olevatele andmebaasi struktuuri dumpidele on vÔimalik kontrollida tootmisbaasi tÀpset vastavust nÔutud struktuurile. See tagab, et tootmisbaasi on edukalt kantud kÔik muudatused, mida arendajad kavandasid.
Kuna PostgreSQL-is on , soovitatakse jÀrgida jÀrgmisi juurutamise etappe, et vajadusel 'valutult' teostada. RULLI TAGASI:
- Alusta tehingut.
- Tehingus teosta kÔik migratsioonid.
- Samuti teosta selles tehingus
deployDump - Ilma tehingut lÔpetamata teosta
verifyDump. Kui vigu ei ole, teostaCOMMIT. Kui vigu on, teostaRULLI TAGASI
Need sammud on piisavalt lihtsalt integreeritavad olemasolevatesse rakenduste juurutamise meetoditesse, sealhulgas zero-downtime'i lÀhenemistesse.
KokkuvÔte
Ălaltoodud meetodite abil on vĂ”imalik maksimeerida «PHP + PostgreSQL» projektide jĂ”udlust, ohverdades samas suhteliselt vĂ€ikese arenduse mugavuse vĂ”rreldes kogu Ă€ri-logika realiseerimisega rakenduse pĂ”hikoodis. Lisaks sellele, andmete töötlemine nĂ€eb sageli vĂ€lja lĂ€bipaistvam ja nĂ”uab vĂ€hem koodi, kui sama funktsionaalsus, kirjutatud PHP-s.
Allikas: habr.com
