Přejít k navigační liště

Zdroják » Zprávičky » Verzování databází

Verzování databází

Zprávičky Databáze

Verzovací nástroje pro správu zdrojových kódů jsou už mezi vývojáři poměrně široce akceptované. Server techPortal zveřejnil obšírný článek na téma verzování databází, v němž představuje postupy i vhodné nástroje.

Komentáře

Subscribe
Upozornit na
guest
23 Komentářů
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
View all comments
BoneFlute

Tak nějak to dělám. Největší problém je donutit vývojáře to dodržovat.

Mám adresářovou strukturu:

postgresql/
  1/
    create/
      create-user.sql
      create-database.sql
      create-schema.sql
    purge/
      ...
    update/
      1.sql
      2.sql
      3.sql
      ...

Pak to používám příkazem:
php manage.php install
nebo
php manage.php update

Přičemž v databázi si uchovávám uloženou funkci, která udržuje verzi.

Ped

Ja jedu na Doctrine1.2, mam k tomu par vlastnich scriptu, takze ve chvili kdyz je aktualni dev verze hodna DB upgradu, tak pustim script db_migrations/dif­fmodel … vysledny script rucne zkontroluji/doplnim (v 95% pripadu generator pokryje vse co je potreba, down jsou teda nekdy mirne nefunkcni, ale to mne netrapi, potrebuji jen „up“ a v pripade nouze by se opravili), commitnu a hotovo.

Pak si volam pri nasazeni script „db_migration­s/upgrade PDO_DSN_STRING“ a to uz mi samo vypise aktualni verzi, potencionalni verzi pro upgrade a kdyz to potvrdim, tak to pusti migracni scripty.

Zatim mam 8 verzi DB, kazdy upgrade byl hotovy od chvile kdyz jsem si rekl ze ted je zdrojak pripraveny na dalsi revizi DB az po nasazeni verze a provedeni migrace ostre produkcni DB do 15min. (vcetne commitu, testu, zaloh a nasazeni)

josefrichter

ale opět jedna ukázka jak se v php světě řeší to, co je v ruby/rails světě dávno uspokojivě vyřešeno

josefrichter

Asi máte pravdu. I když java není zrovna typicky „webařskej“ jazyk.

josefrichter

Mně jenom přišlo, že se občas zbytečně znovu vynalézá kolo (a to i v ruby světě). Když něco funguje vedle, tak proč to prostě prachsprostě neokopírovat?

alefo

Skôr nie je typický *známy* webársky jazyk. Hoci si Javu nerozbeháte na free webhostingu, firmy na tom fičia statočne a frameworkov je toľko, koľko v ostatných jazykoch dohromady (až možno priveľa).

Ale chcel by som vedieť, ako sa to rieši v Jave.

BoneFlute

Ocenil bych odkaz. Ať se mám čím inspirovat/oko­pírovat/zavrhnou­t.

josefrichter
BoneFlute

No je to hezké. Mají to lepší v abstrakci databáze. Ale nenašel jsem tam migraci dat. Opravdu ty Rails neřeší migraci dat, nebo jsem to jen přehlédl?

No, a vzhledem k tomu, že Rails používá koncept ActiveRecordu, navíc je vázaný jen na databázi, tak je to sice uspokojivě vyřešeno, ale jen v té jedné úzké oblasti. A dnes už je ActiveRecord pasé.

Přijde mi ten můj způsob lepší, bo obecnější. Jediné co se mi líbí a o čem bych rád pouvažoval je automatické generování změn, o kterých se zmínil Peter Helcmanovsky. Ale k tomu musí být podpora toho frameworku.

jos

myslim že je to spíš ukázka toho, jak je SQL naprd. nemá uspokojivě vyřešenej upgrade schématu a chudáci vývojáři to musí řešit v jinejch jazycích.

BoneFlute

Nepřijde ti to jako poněkud vágní poznámka?

Upgrade schématu má SQL vyřešené imho perfektně. Rozdíl je v tom, že se nejedná o verzování. Což je správně.

jos

no dejme tomu že jo, ale třeba muj vendor neporporuje DDL v transakci, takže pro mě to neplatí

a kdyby sám dodával něco použitelnýho k tomu verzování, tak bych byl radši

BoneFlute

To, že tvůj vendor – předpokládám že MySQL, neumí DDL v transakci je samozřejmě zásadní problém. Ale není to chyba SQL, ale chyba databáze. Reaguji na tvou poznámku, že SQL je naprd. Není. Naprd je MySQL. A to všichni (doufám) víme.

K céčku, nebo k javě se také nedodává něco použitelnýho k verzování. Používají se na to nástroje jako git, mercurial a tak.

jos

muj vendor je Microsoft

SQL nemam rád z mnoha jiných důvodů, tohle je jen taková kapka

teď mě tak napadlo, kdyby SQL podporovalo relační přiřazeni, tak spousta ošklivejch věcí odpadá

Karel

Jak je uvedeno již v komentáři pod článkem – vše se týká jen schematu databáze. Ve chvíli, kdy jde o data, jste opět na počátku. V mé praxi ty jednotlivé „patch level sql“ soubory obsahují kromě DDL i řadu netriviálních DML příkazů, které plní nové tabulky, nové sloupce, ale také přepisují ty již existující. Také to celé začne být mnohem zajímavější ve chvíli, kdy jsou mezi tabulkami reference. A úplně největší zábava to bude když se objeví i něco jiného než SQL (TSQL v MS SQL, PGSQL v PostgreSQL apod.) Zkrátka, přijde mi to jako výborné nástroje na projekty, kdy se jen připisují nové tabulky a občas sloupce. A tabulky jen prázdné a sloupce zásadně default null. Ovšem ani na webu si to nedokážu představit, i ta MediaWiki v patchi občas updatuje existující data.

BoneFlute

V případě systému, kterým jsem se pochlubil, tak nikoliv. Tam se to týká nejen schematu, ale i dat.

Uvedu příklad:
Mám tabulku, kterou mám lokalizovat. vytvořím se tedy nový n.sql soubor, a do něj napíšu
1. vytvoření nové lokalizující tabulky (něco jako article + article_locale).
2. Dále napíšu příkaz, kterým překopíruju všechny data z původní tabulky do nové.
3. Další příkazy, kterými přidám cizí klíče
4. Další příkaz, kterým odstraním staré klíče a staré sloupce.
5. další změny, dle libosti, jako je třeba nová data, nebo úprava dat.

Protože jeden soubor spouštím v transakci, tak v případě Postgresql mi to při neúspěchu spadne, a mohu opravit. (Například situace, kdy na ostrém serveru jsou data, se kterýma jsem nepočítal.) Tím mám zajištěno, že buď se databáze povíší, nebo ne. Stejná trasakčnost, jako u commitu.

Zapoměl jsem na něco, co by bylo třeba? Tento systém jsem uvažoval naopak nad velkou ostrou běžící databází, ne nad lokálem, kde si to můžete opravovat.

v6ak

Jen bacha na to, jak daná DB pracuje s transakcemi a DDL. Co jsem zkoušel u MySQL, tak takový rollback asi neovlivňuje DDL příkazy – ty asi jdou mimo transakci. (Ale nezkoušel jsem to úplně důkladně a možná je to dnes jinak.)

BoneFlute

Máš pravdu. MySQL je strašná. Pokud by někdo věděl, jak ji přinutit, aby dělala DDLka v trasakci, byl bych moc rád.

okbob

Tohle MySQL nepodporuje. Prostě jakýkoliv DDL způsobí commit, a pak už není cesty zpátky. Možná v budoucích verzích – Drizle by to snad mělo umět.

Jakub Vrána

Adminer nabízí možnost změny synchronizovat pomocí ALTER exportu.

Enum a statická analýza kódu

Mám jednu univerzální radu pro začínající programátorty. V učení sice neexistují rychlé zkratky, ovšem tuhle radu můžete snadno začít používat a zrychlit tak tempo učení. Tou tajemnou ingrediencí je statická analýza kódu. Ukážeme si to na příkladu enum.