KĂ€esoleva artikli eesmĂ€rk on nĂ€idata raamatukogu nĂ€itel tööriistu, mis suudavad oluliselt lihtsustada andmebaaside arendamise protsessi PHP-projektides, mis kasutavad andmebaasisĂŒsteemi PostgreSQL.
Selle artikli teave on eelkÔige kasulik arendajatele, kes soovivad maksimaalselt Àra kasutada PostgreSQL-i vÔimalusi, kuid seisavad silmitsi probleemidega, mis on seotud ettevÔtte loogika sÀilitamisega andmebaasis.
Artikkel ei kÀsitle ettevÔtte loogika sÀilitamise eeliseid ega puudusi andmebaasis. Eeldatakse, et lugeja on juba valiku teinud.
KÀesolevas tööks uuritakse jÀrgmisi teemasid:
- Millises vormis hoida andmebaasi struktuuri dump versioonihaldussĂŒsteemis (edaspidi - VCS)
- Kuidas jÀlgida andmebaasi struktuuri muudatusi pÀrast dumpi salvestamist
- Kuidas edastada andmebaasi struktuuri muudatusi teistesse keskkondadesse ilma konfliktide ja hiiglaslike migratsioonifailideta
- Kuidas korraldada mitme arendaja paralleelset tööd projekti kallal
- Kuidas turvaliselt juurutada suurem hulk muudatusi andmebaasi struktuuris tootmiskeskkonnas
SchemaKeeper on kohandatud salvestatud protseduuridega, mis on kirjutatud keeles . Testimist teiste keeltes ei ole tehtud, seega vÔib kasutamine olla vÀhem tÔhus vÔi vÔimatu.
Millises vormis hoida andmebaasi struktuuri dump VCS-is
Raamatukogu pakub funktsiooni saveDump, mis salvestab andmebaasi kÔigi objektide struktuuri eraldi tekstifailidena. VÀljundina luuakse kataloog, mis sisaldab andmebaasi struktuuri eraldatud failides, mis on hÔlpsasti lisatav VCS-i.
Vaatleme andmebaasi objektide teisendamist failideks mitme nÀite abil:
Objekti tĂŒĂŒp
Schema
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 konkreetse andmebaasi objekti struktuuri tekstiline esitus. NÀiteks salvestatud protseduuride korral on faili sisuks salvestatud protseduuri tÀielik mÀÀratlemine, mis algab plokist CREATE OR REPLACE FUNCTION.
Nagu on nĂ€ha ĂŒlaltoodud tabelist, hoiab faili tee endas teavet objekti tĂŒĂŒbi, skeemi ja nime kohta. Selline lĂ€henemine lihtsustab dumpis navigeerimist ja andmebaasi muudatuste ĂŒlevaatamist.
Laien
.sqlnÀidatud, et IDE-de automaatselt pakkuda tööriistu andmebaasiga suhtlemiseks, kui fail on avatud.
Kuidas jÀlgida andmebaasi struktuuri muudatusi pÀrast dumpi salvestamist
Salvestades hetke andmebaasi struktuuri dump VCS-i, saame kontrollida, kas andmebaasi struktuuri on pÀrast dumpi loomist muudetud. Raamatukogus muutuste tuvastamiseks andmebaasi struktuuris on ette nÀhtud funktsioon verifyDump, mis tagastab teabe erinevuste kohta ilma kÔrvaltoimeteta.
Alternatiivne kontrollimeetod on funktsiooni uuesti kutsumine saveDump, mÀÀrates sama kausta ja kontrollides VCS-is muutuste olemasolu. Kuna kÔik andmebaasi objektid on salvestatud eraldi failidesse, nÀitab VCS ainult muudetud objekte.
Selle meetodi peamine miinus on failide ĂŒlekirjutamise vajadus, et nĂ€ha muudatusi.
Kuidas edastada andmebaasi struktuuri muudatusi teistesse keskkondadesse ilma konfliktide ja hiiglaslike migratsioonifailideta
TĂ€nu funktsioonile deployDump saab salvestatud protseduuride algkoodi redigeerida tĂ€pselt samamoodi nagu tavalist rakenduse algkoodi. Saame lisada/maha vĂ”tta uusi ridu salvestatud protseduuride koodis ja saata muudatused kohe versioonihaldussĂŒsteemi, vĂ”i luua/kustutada salvestatud protseduure, luues/kustutades vastavaid faile dumpi kaustas.
NÀiteks, et luua uus salvestatud protseduur skeemis public on piisav luua uus fail, millel on laiend .sql kaustas public/functions, panna sinna salvestatud protseduuri algkood, sealhulgas plokk CREATE OR REPLACE FUNCTION, ja seejÀrel kutsuda funktsiooni deployDump. Samuti toimub salvestatud protseduuri muutmine ja kustutamine. Seega satub kood samal ajal nii VCS-i kui ka andmebaasi.
Kui salvestatud protseduuri algkoodis ilmneb viga vÔi erimeelsus faili ja salvestatud protseduuri nimede vahel, siis deployDump ei toimi, kuvades viga. Salvestatud protseduuride erisus dumpi ja praeguse andmebaasi vahel on vÔimatu kasutada deployDump.
Uue salvestatud protseduuri loomisel ei ole vaja kÀsitsi sisestada Ôiget faili nime. Piisab, kui failil on laiend
.sql. PĂ€rast kutsumistdeployDumpkuvab vea tekst Ă”ige nime, mida saab faili ĂŒmbernimetamiseks kasutada.
deployDump vĂ”imaldab funktsiooni parameetreid vĂ”i tagastatavat tĂŒĂŒpi muuta ilma tĂ€iendavate toiminguteta, samas kui klassikalise lĂ€henemise korral oleks pidanud
esmajÀrjekorras tÀitma KUSTUTA FUNKTSIOON, ja alles seejÀrel CREATE OR REPLACE FUNCTION.
Kahjuks on olukordi, kus deployDump ei suudeta muudatusi automaatselt rakendada. NĂ€iteks juhul, kui kustutatakse kĂ€ivitaja funktsioon, mida kasutab vĂ€hemalt ĂŒks kĂ€ivitaja. Sellised olukorrad lahendatakse kĂ€sitsi migratsioonifailide abil.
Kui muutuste ĂŒlekande eest salvestatud protseduurides vastutab ise , siis teiste struktuurimuudatuste ĂŒlekandmiseks tuleb kasutada migratsioonifaile. NĂ€iteks on hea migratsioonidega töötamiseks raamatukogu .
Migratsioonid tuleb rakendada enne kÀivitamist deployDump. See vÔimaldab teha kÔik struktuuri muudatused ja lahendada probleemsed olukorrad, et salvestatud protseduurides tehtud muudatused saaksid hiljem probleemideta edasi kanduda.
Migratsioonide töö kohta on rohkem teavet jÀrgmistes jaotistes.
Kuidas korraldada mitme arendaja paralleelset tööd projekti kallal
On vaja luua DB tÀieliku initsialiseerimise skript, mida arendaja kÀivitab oma töömasinas, viies kohaliku DB struktuuri vastavusse VCS-s salvestatud dumpiga. KÔige lihtsam on jagada kohaliku DB initsialiseerimine kolmeks sammuks:
- Baasskeemi faili importimine, mis kannab nime nÀiteks
base.sql - Migratsioonide rakendamine
- Kutsumine
deployDump
base.sqlâ see on lĂ€htepunkt, mille peale rakendatakse migratsioonid ja tĂ€idetaksedeployDump, see tĂ€hendabbase.sql + migratsioonid + deployDump = ajakohane DB struktuur. Sellise faili saab genereerida utiliidigapg_dump. Kasutataksebase.sqlainult DB algse initsialiseerimise ajal.
Nimetame DB tÀieliku initsialiseerimise skripti refresh.sh. Tööprotsess vÔib vÀlja nÀha jÀrgmine:
- Arendaja kÀivitab oma keskkonnas
refresh.shja saab ajakohase DB struktuuri - Arendaja hakkab töötama mÀÀratud ĂŒlesande kallal, muutes kohaliku DB uue funktsionaalsuse vajadustele vastavaks (
ALTER TABLE ... lisa veergjne) - PĂ€rast ĂŒlesande tĂ€itmist kutsub arendaja vĂ€lja funktsiooni
saveDump, et fikseerida VCS-is DB-s tehtud muudatused - Arendaja kÀivitab uuesti
refresh.sh, seejĂ€relverifyDump, mis nĂŒĂŒd nĂ€itab muudatuste nimekirja migreerimiseks - Arendaja kannab kĂ”ik struktuuri muudatused migratsioonifaili, kĂ€ivitab uuesti
refresh.shjaverifyDump, ja kui migratsioon on korrektselt koostatud,verifyDumpnÀitab, et kohaliku DB ja salvestatud dumpi vahel pole erinevusi.
Ălaltoodud protsess on kooskĂ”las gitflow pĂ”himĂ”tetega. Iga haru VCS-is sisaldab oma dump'i versiooni ning harude ĂŒhendamisel toimub dump'ide liitmine. Enamikul juhtudel ei ole pĂ€rast liitmist vaja mingit tĂ€iendavat tegevust, kuid kui erinevates harudes on tehtud muudatusi, nĂ€iteks samas tabelis, vĂ”ib konflikt tekkida.
Vaatleme konfliktset olukorda nĂ€ite abil: on haru develop, millest on harunenud kaks haru: feature1 ja feature2, mis ei ole konfliktis develop, kuid on konfliktis omavahel. EesmĂ€rk on mĂ”lema haru liitmine develop. Selle jaoks soovitatakse esmalt liita ĂŒks haru develop, seejĂ€rel liita develop jÀÀkharusse, lahendades sealjuures konfliktid jÀÀnud haru osas, pĂ€rast mida liita viimane haru develop. Konfliktide lahendamise etapis vĂ”ib osutuda vajalikuks parandada migratsioonifail viimasel harul, et see vastaks lĂ”ppdump'ile, mis sisaldab liitmise tulemusi.
Kuidas turvaliselt juurutada suurem hulk muudatusi andmebaasi struktuuris tootmiskeskkonnas
TÀnu VCS-is oleva aktuaalse andmebaasi struktuuri dump'ile on vÔimalik kontrollida production-andmebaasi tÀpset vastavust nÔutavale struktuurile. See tagab, et kÔik arendajate soovitud muudatused on edukalt toodetud andmebaasi viidud.
Kuna PostgreSQL-is on , on soovitatav jÀrgida jÀrgmist juurutamise jÀrjekorda, et juhuslike vigade korral oleks vÔimalik "valutult" teostada ROLLBACK:
- Alusta tehingut
- Tehingu raames teosta kÔik migratsioonid
- Samas tehingus teosta
deployDump - Ilma tehingut lÔpetamata teosta
verifyDump. Kui vigu ei ole, teostaCOMMIT. Kui vigu on, teostaROLLBACK
Need sammud on piisavalt lihtsad, et neid saaks integreerida olemasolevatesse rakenduste juurutamise lÀhenemistesse, sealhulgas zero-downtime.
KokkuvÔte
Ălaltoodud meetodite abil on vĂ”imalik maksimeerida "PHP + PostgreSQL" projektide jĂ”udlust, ohverdades samal ajal suhteliselt vĂ€ikese mugavuse arendamisel vĂ”rreldes kogu Ă€ri loogika rakendamisega rakenduse pĂ”hiprogrammis. Veelgi enam, andmete töötlemine nĂ€eb sageli vĂ€lja lĂ€bipaistvam ja vajab vĂ€hem koodi kui sama funktsionaalsus, mis on kirjutatud PHP-s.
Allikas: habr.com
