{"id":70973,"date":"2020-02-23T00:58:26","date_gmt":"2020-02-22T21:58:26","guid":{"rendered":"https:\/\/prohoster.info\/blog\/kak-ne-vystrelit-sebe-v-nogu-ispolzuya-liquibase"},"modified":"2020-03-03T16:14:41","modified_gmt":"2020-03-03T13:14:41","slug":"kak-ne-vystrelit-sebe-v-nogu-ispolzuya-liquibase","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/kak-ne-vystrelit-sebe-v-nogu-ispolzuya-liquibase","title":{"rendered":"Ako si neubli\u017eova\u0165 pri pou\u017eit\u00ed Liquibase","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Nikdy to nebylo, a p\u0159esto znovu!<\/p>\n<p><\/p>\n<p>V dal\u0161\u00edm projektu jsme se rozhodli pou\u017e\u00edt Liquibase od za\u010d\u00e1tku, abychom v budoucnu p\u0159ede\u0161li probl\u00e9m\u016fm. Jak se uk\u00e1zalo, ne v\u0161ichni mlad\u00ed \u010dlenov\u00e9 t\u00fdmu v\u011bd\u00ed, jak ho spr\u00e1vn\u011b pou\u017e\u00edvat. Uskute\u010dnil jsem intern\u00ed workshop, kter\u00fd jsem se rozhodl prom\u011bnit v \u010dl\u00e1nek. <\/p>\n<p><\/p>\n<p>\u010cl\u00e1nek obsahuje u\u017eite\u010dn\u00e9 rady a popis t\u0159\u00ed nejz\u0159ejm\u011bj\u0161\u00edch n\u00e1strah, do kter\u00fdch se m\u016f\u017eete dostat p\u0159i pr\u00e1ci s n\u00e1stroji pro migraci rela\u010dn\u00edch datab\u00e1z\u00ed, zejm\u00e9na s Liquibase. Je ur\u010den pro Java v\u00fdvoj\u00e1\u0159e na \u00farovni Junior a Middle, pro zku\u0161en\u011bj\u0161\u00ed v\u00fdvoj\u00e1\u0159e m\u016f\u017ee b\u00fdt zaj\u00edmav\u00fd pro strukturalizaci a opakov\u00e1n\u00ed toho, co pravd\u011bpodobn\u011b u\u017e v\u011bd\u00ed. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ako si neubli\u017eova\u0165 pri pou\u017eit\u00ed Liquibase\" src=\"\/wp-content\/uploads\/2020\/02\/f8b3c9a456bde7aa123702fae132b4b8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Liquibase a Flyway jsou hlavn\u00ed sout\u011b\u017e\u00edc\u00ed technologie pro \u0159e\u0161en\u00ed \u00fakol\u016f verzov\u00e1n\u00ed rela\u010dn\u00edch struktur ve sv\u011bt\u011b Java. Prvn\u00ed je zcela bezplatn\u00e1 a ve skute\u010dnosti je \u010dast\u011bji vyb\u00edr\u00e1na pro pou\u017eit\u00ed, proto byl pr\u00e1v\u011b Liquibase zvolen hrdinou publikace. Nicm\u00e9n\u011b n\u011bkter\u00e9 z popsan\u00fdch praktik mohou b\u00fdt univerz\u00e1ln\u00ed, v z\u00e1vislosti na architektu\u0159e va\u0161\u00ed aplikace. <\/p>\n<p><\/p>\n<p>Migrace rela\u010dn\u00edch struktur je nevyhnuteln\u011b vznikl\u00fd zp\u016fsob boje se slabou flexibilitou rela\u010dn\u00edch datov\u00fdch sklad\u016f. V \u00e9\u0159e m\u00f3dy na OOP se styl pr\u00e1ce s DB p\u0159edpokl\u00e1dal tak, \u017ee jednou pop\u00ed\u0161eme schema a nebudeme ji v\u00edce m\u011bnit. Ale realita je v\u017edy takov\u00e1, \u017ee se v\u0161e m\u011bn\u00ed, a zm\u011bny ve struktu\u0159e tabulek jsou pot\u0159eba docela \u010dasto. Samoz\u0159ejm\u011b, \u017ee proces s\u00e1m o sob\u011b m\u016f\u017ee b\u00fdt bolestiv\u00fd a nep\u0159\u00edjemn\u00fd. <\/p>\n<p><\/p>\n<p>Nebudu se zde hloub\u011bji zab\u00fdvat popisem technologie a instrukcemi pro p\u0159id\u00e1n\u00ed knihovny do va\u0161eho projektu, na toto t\u00e9ma bylo naps\u00e1no dost \u010dl\u00e1nk\u016f:<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/460377\/\">Pou\u017eit\u00ed Liquibase pro spr\u00e1vu struktury DB v aplikaci Spring Boot. \u010c\u00e1st 1<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/460907\/\">Pou\u017eit\u00ed Liquibase pro spr\u00e1vu struktury DB v aplikaci Spring Boot. \u010c\u00e1st 2<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/436994\/\">Liquibase a Maven<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/330662\/\">P\u0159\u00edstupy k verzov\u00e1n\u00ed zm\u011bn DB<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/271719\/\">Spring MVC\/Security, REST, Hibernate, Liquibase spou\u0161t\u00edme ve dvou \u0159\u00e1dc\u00edch<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<p>Krom\u011b toho ji\u017e byl skv\u011bl\u00fd \u010dl\u00e1nek na t\u00e9ma u\u017eite\u010dn\u00fdch rad:<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/179425\/\">Pou\u017eit\u00ed Liquibase bez bolest\u00ed hlavy. 10 rad z re\u00e1ln\u00fdch zku\u0161enost\u00ed v\u00fdvoje<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"sovety\">Rady<\/h2>\n<p><\/p>\n<p>Chci se pod\u011blit o sv\u00e9 rady a koment\u00e1\u0159e, kter\u00e9 vznikly skrze pot, krev a bolest p\u0159i \u0159e\u0161en\u00ed probl\u00e9m\u016f s migrac\u00ed.<\/p>\n<p><\/p>\n<h3 id=\"1--pered-rabotoy-sleduet-oznakomitsya-s-razdelom-luchshih-praktik-na-saytehttpswwwliquibaseorgbestpracticeshtml-liquibase\">1. P\u0159ed prac\u00ed se doporu\u010duje \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f s \u010d\u00e1st\u00ed nejlep\u0161\u00edch praktik na <noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/bestpractices.html\">webe<\/a><\/noindex> Liquibase<\/h3>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/bestpractices.html\">Tam<\/a><\/noindex> s\u00fa pop\u00edsan\u00e9 jednoduch\u00e9, ale ve\u013emi d\u00f4le\u017eit\u00e9 veci, bez ktor\u00fdch pou\u017e\u00edvanie kni\u017enice m\u00f4\u017ee skomplikova\u0165 v\u00e1\u0161 \u017eivot. Napr\u00edklad, ne\u0161trukt\u00farovan\u00fd pr\u00edstup k spr\u00e1ve changsetov sk\u00f4r \u010di nesk\u00f4r povedie k zm\u00e4tku a nefunk\u010dn\u00fdm migr\u00e1ci\u00e1m. Ak sa z\u00e1visl\u00e9 zmeny \u0161trukt\u00fary DB a logiky slu\u017eieb nevyd\u00e1vaj\u00fa s\u00fa\u010dasne, existuje ve\u013ek\u00e1 pravdepodobnos\u0165, \u017ee to povedie k \u010derven\u00fdm testom alebo nefunk\u010dn\u00e9mu prostrediu. Okrem toho, odpor\u00fa\u010dania na pou\u017e\u00edvanie Liquibase na ofici\u00e1lnej str\u00e1nke obsahuj\u00fa bod o v\u00fdvoji a kontrole rollback skriptov spolu so z\u00e1kladn\u00fdmi skriptmi migr\u00e1cie. A v \u010dl\u00e1nku <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/178665\/\">https:\/\/habr.com\/ru\/post\/178665\/<\/a><\/noindex> n\u00e1jdete pr\u00edklady k\u00f3du t\u00fdkaj\u00faceho sa migr\u00e1ci\u00ed a rollback mechanizmu. <\/p>\n<p><\/p>\n<h3 id=\"2-esli-nachali-ispolzovat-sredstva-migracii--ne-dopuskayte-manualnyh-ispravleniy-v-strukture-bazy\">2. Ak za\u010dnete pou\u017e\u00edva\u0165 n\u00e1stroje migr\u00e1cie - nedovo\u013ete manu\u00e1lne opravy v \u0161trukt\u00fare datab\u00e1zy<\/h3>\n<p><\/p>\n<p>Ako sa hovor\u00ed: \u201eRaz Persil \u2014 nav\u017edy Persil\u201c. Ak va\u0161a datab\u00e1za aplik\u00e1cie za\u010dala by\u0165 spravovan\u00e1 n\u00e1strojmi Liquibase \u2014 ak\u00e9ko\u013evek ru\u010dn\u00e9 zmeny okam\u017eite ved\u00fa k nekonzistentn\u00e9mu stavu a \u00farove\u0148 d\u00f4very v changsety kles\u00e1 na nulu. Potenci\u00e1lne rizik\u00e1 \u2014 nieko\u013eko str\u00e1ven\u00fdch hod\u00edn na obnovu datab\u00e1zy, v najhor\u0161om pr\u00edpade \u2014 zni\u010den\u00fd server. Ak m\u00e1 va\u0161a t\u00edm DBA Architekta \u201estarej \u0161koly\u201c, trpezlivo a zamyslene mu vysvetlite, ako zle to skon\u010d\u00ed, ak jednoducho uprav\u00ed datab\u00e1zu pod\u013ea svojho uv\u00e1\u017eenia z podmienen\u00e9ho SQL Developer. <\/p>\n<p><\/p>\n<h3 id=\"3-esli-chendzhset-uzhe-byl-zapushen-v-repozitoriy-izbegayte-redaktirovaniya\">3. Ak bol changset u\u017e odoslan\u00fd do repozit\u00e1ra, vyhnite sa \u00faprav\u00e1m<\/h3>\n<p><\/p>\n<p>Ak in\u00fd v\u00fdvoj\u00e1r urobil pull a uplatnil changset, ktor\u00fd sa nesk\u00f4r uprav\u00ed, \u2014 ur\u010dite v\u00e1s spomenie v dobrom, ke\u010f dostane chybu pri spusten\u00ed aplik\u00e1cie. Ak sa \u00faprava changsetu ak\u00fdmko\u013evek sp\u00f4sobom prepust\u00ed do v\u00fdvoja \u2014 bude potrebn\u00e9 \u00eds\u0165 klzkou cestou hotfixov. Podstata probl\u00e9mu spo\u010d\u00edva vo valid\u00e1cii zmien pod\u013ea hash sumy \u2014 hlavn\u00fd mechanizmus Liquibase. Pri \u00faprave k\u00f3du changsetu sa zmen\u00ed hash suma. \u00dapravy changsetov s\u00fa mo\u017en\u00e9 iba vtedy, ak existuje mo\u017enos\u0165 bez straty d\u00e1t rozvin\u00fa\u0165 cel\u00fa datab\u00e1zu od nuly. V takom pr\u00edpade m\u00f4\u017ee refaktoring SQL alebo XML k\u00f3du, naopak, u\u013eah\u010di\u0165 \u017eivot a spravi\u0165 migr\u00e1cie \u010ditate\u013enej\u0161\u00edmi. Pr\u00edkladom m\u00f4\u017ee by\u0165 situ\u00e1cia, ke\u010f bola pri \u0161tarte aplik\u00e1cie sch\u00e9ma po\u010diato\u010dnej DB dohodnut\u00e1 v r\u00e1mci t\u00edmu. <\/p>\n<p><\/p>\n<h3 id=\"4--imey-proverennye-bekapy-baz-dannyh-esli-eto-vozmozhno\">4. Maj ma\u0165 overen\u00e9 z\u00e1lohy datab\u00e1z, ak je to mo\u017en\u00e9<\/h3>\n<p><\/p>\n<p>Tu je asi v\u0161etko jasn\u00e9. V pr\u00edpade, \u017ee migr\u00e1cia sa z nejak\u00e9ho d\u00f4vodu nevydar\u00ed, v\u0161etko sa d\u00e1 vr\u00e1ti\u0165 sp\u00e4\u0165. V Liquibase existuje n\u00e1stroj na vr\u00e1tenie zmien, ale skripty na vr\u00e1tenie p\u00ed\u0161e tie\u017e s\u00e1m v\u00fdvoj\u00e1r, a v t\u00fdchto skriptoch m\u00f4\u017eu by\u0165 probl\u00e9my s rovnakou pravdepodobnos\u0165ou ako v skriptoch hlavn\u00e9ho changsetu. To znamen\u00e1, \u017ee je u\u017eito\u010dn\u00e9 ma\u0165 z\u00e1lohy pre istotu. <\/p>\n<p><\/p>\n<h3 id=\"5-ispolzuy-proverennye-bekapy-baz-dannyh-v-razrabotke-esli-eto-vozmozhno\">5. Pou\u017e\u00edvaj overen\u00e9 z\u00e1lohy datab\u00e1z vo v\u00fdvoji, ak je to mo\u017en\u00e9<\/h3>\n<p><\/p>\n<p>Ak to nie je v rozpore zmluvami a ochranou osobn\u00fdch \u00fadajov, v datab\u00e1ze nie s\u00fa \u017eiadne osobn\u00e9 \u00fadaje a nie je to tak\u00e9 \u0165a\u017ek\u00e9 ako dve slnka \u2014 pred pou\u017eit\u00edm migr\u00e1cie na \u017eiv\u00fdch serveroch je mo\u017en\u00e9 skontrolova\u0165, ako to funguje na v\u00fdvoj\u00e1rskom stroji a takmer 100 % odhadn\u00fa\u0165 potenci\u00e1lne probl\u00e9my pri migr\u00e1cii. <\/p>\n<p><\/p>\n<h3 id=\"6-obschaysya-s-drugimi-razrabotchikami-v-komande\">6. Komunikuj s ostatn\u00fdmi v\u00fdvoj\u00e1rmi v t\u00edme<\/h3>\n<p><\/p>\n<p>V spr\u00e1vne organizovanom procese v\u00fdvoja v\u0161etci v t\u00edme vedia, kto na \u010dom pracuje. V praxi to v\u0161ak \u010dasto nie je tak, a preto, ak pripravuje\u0161 zmeny v \u0161trukt\u00fare datab\u00e1zy v r\u00e1mci svojej \u00falohy, je dobr\u00e9 informova\u0165 o tom cel\u00fd t\u00edm. Ak niekto rob\u00ed zmeny paralelne \u2014 mali by ste sa organizova\u0165 opatrne. S kolegami je dobr\u00e9 komunikova\u0165 aj po dokon\u010den\u00ed pr\u00e1ce, nielen na za\u010diatku. Mnoho potenci\u00e1lnych probl\u00e9mov s changsetmi sa m\u00f4\u017ee vyrie\u0161i\u0165 po\u010das k\u00f3du kontroly. <\/p>\n<p><\/p>\n<h3 id=\"7-dumay-chto-delaesh\">7. Prem\u00fd\u0161\u013eaj, \u010do rob\u00ed\u0161!<\/h3>\n<p><\/p>\n<p>Zdalo by sa, \u017ee ide o samozrejm\u00fa radu, ktor\u00fa je mo\u017en\u00e9 uplatni\u0165 vo v\u0161etk\u00fdch situ\u00e1ci\u00e1ch. Mnoh\u00e9 probl\u00e9my by sa v\u0161ak dali pred\u00eds\u0165, ak by si v\u00fdvoj\u00e1r e\u0161te raz analyzoval, \u010do rob\u00ed a ak\u00fd to m\u00f4\u017ee ma\u0165 dopad. Pr\u00e1ca s migr\u00e1ciami v\u017edy vy\u017eaduje osobitn\u00fa pozornos\u0165 a opatrnos\u0165. <\/p>\n<p><\/p>\n<h2 id=\"lovushki\">Pasce<\/h2>\n<p><\/p>\n<p>Teraz sa pozrime na typick\u00e9 pasce, do ktor\u00fdch sa d\u00e1 spadn\u00fa\u0165, ak sa nedodr\u017eiavaj\u00fa vy\u0161\u0161ie uveden\u00e9 rady, a \u010do vlastne robi\u0165?<\/p>\n<p><\/p>\n<h3 id=\"situaciya-1-dva-razrabotchika-pytayutsya-odnovremenno-dobavlyat-novye-chendzhsety\">Situ\u00e1cia 1. Dvaja v\u00fdvoj\u00e1ri sa sna\u017eia s\u00fa\u010dasne prida\u0165 nov\u00e9 changsety<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ako si neubli\u017eova\u0165 pri pou\u017eit\u00ed Liquibase\" src=\"\/wp-content\/uploads\/2020\/02\/20706fc970510bc06634fa001a4c7ceb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nV\u00e1clav a Peter chc\u00fa vytvori\u0165 changset verzie 4, ani\u017e by o sebe vedeli. Urobili zmeny v \u0161trukt\u00fare datab\u00e1zy a vytvorili pull request s r\u00f4znymi s\u00fabormi changsetu. Nasleduje navrhnut\u00fd mechanizmus akci\u00ed:<\/p>\n<p><\/p>\n<h4 id=\"kak-reshat\">Ako rie\u0161i\u0165<\/h4>\n<p><\/p>\n<ol>\n<li>Niez ak\u00fdmko\u013evek sp\u00f4sobom by sa mali kolegovia dohodn\u00fa\u0165, v akom porad\u00ed by mali \u00eds\u0165 ich changsety, predpokladajme, \u017ee Petrov by mal by\u0165 aplikovan\u00fd ako prv\u00fd. <\/li>\n<li>Jeden \u010dlovek by mal prida\u0165 druh\u00fd k sebe a ozna\u010di\u0165 changset Va\u0161ou verziou 5. To sa m\u00f4\u017ee uskuto\u010dni\u0165 prostredn\u00edctvom Cherry Pick alebo starostliv\u00e9ho merge. <\/li>\n<li>Po zmen\u00e1ch je nevyhnutn\u00e9 skontrolova\u0165 validitu vykonan\u00fdch akci\u00ed.<br \/>\nV skuto\u010dnosti mechanizmy Liquibase umo\u017e\u0148uj\u00fa ma\u0165 v repozit\u00e1ri dva changsety verzie 4, tak\u017ee m\u00f4\u017eete necha\u0165 v\u0161etko tak, ako je. To znamen\u00e1, \u017ee jednoducho budete ma\u0165 dve zmeny verzie 4 s r\u00f4znymi n\u00e1zvami. Pri tomto pr\u00edstupe sa nesk\u00f4r vo verzi\u00e1ch datab\u00e1zy st\u00e1va ve\u013emi \u0165a\u017ek\u00e9 sa orientova\u0165. <\/li>\n<\/ol>\n<p><\/p>\n<p>Okrem toho, Liquibase, ako dom hobitov, skr\u00fdva mnoho tajomstiev. Jedn\u00fdm z nich je k\u013e\u00fa\u010d validCheckSum, ktor\u00fd sa objavil vo verzii 1.7 a umo\u017e\u0148uje uvies\u0165 platn\u00fa hodnotu hash sumy pre konkr\u00e9tny changset, bez oh\u013eadu na to, \u010do je ulo\u017een\u00e9 v datab\u00e1ze. Dokument\u00e1cia <noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/documentation\/changeset.html\">https:\/\/www.liquibase.org\/documentation\/changeset.html<\/a><\/noindex> hovor\u00ed nasledovn\u00e9:<\/p>\n<p><\/p>\n<blockquote><p>Pridajte kontroln\u00fd s\u00fa\u010det, ktor\u00fd sa pova\u017euje za platn\u00fd pre tento changeSet, bez oh\u013eadu na to, \u010do je ulo\u017een\u00e9 v datab\u00e1ze. Pou\u017e\u00edva sa najm\u00e4 vtedy, ke\u010f potrebujete zmeni\u0165 changeSet a nechcete, aby sa na datab\u00e1zach, na ktor\u00fdch sa u\u017e vykonal, vyhadzovali chyby (nie je to odpor\u00fa\u010dan\u00e1 proced\u00fara).<\/p><\/blockquote>\n<p>\u00c1no, t\u00e1to proced\u00fara sa neodpor\u00fa\u010da. Ale niekedy mocn\u00fd biely m\u00e1g ovl\u00e1da aj temn\u00e9 techniky. <\/p>\n<p><\/p>\n<h3 id=\"situaciya-2-migraciya-kotoraya-zavisit-ot-dannyh\">Situ\u00e1cia 2. Migr\u00e1cia, ktor\u00e1 z\u00e1vis\u00ed od \u00fadajov.<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ako si neubli\u017eova\u0165 pri pou\u017eit\u00ed Liquibase\" src=\"\/wp-content\/uploads\/2020\/02\/31a6eebb55278c0631115bf16483c7b8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Predpokladajme, \u017ee nem\u00e1te mo\u017enos\u0165 pou\u017e\u00edva\u0165 z\u00e1lohy datab\u00e1z z \u017eiv\u00fdch serverov. Pe\u0165a vytvoril changset, skontroloval ho lok\u00e1lne a s plnou istotou svojej pravdy urobil pull request do develop. Ved\u00faci projektu pre ka\u017ed\u00fa istotu skontroloval, \u010di to Pe\u0165a skontroloval, a potom ho zl\u00fa\u010dil. Ale nasadenie na develop serveri zlyhalo.<\/p>\n<p><\/p>\n<p>V skuto\u010dnosti to mo\u017en\u00e9 je a nikto nie je tomu chr\u00e1nen\u00fd. K tomu doch\u00e1dza v pr\u00edpade, \u017ee modifik\u00e1cie \u0161trukt\u00fary tabuliek s\u00fa nejak\u00fdm sp\u00f4sobom viazan\u00e9 na konkr\u00e9tne \u00fadaje z datab\u00e1zy. Je jasn\u00e9, \u017ee ak je Pe\u0165ova datab\u00e1za zaplnen\u00e1 len testovac\u00edmi \u00fadajmi, nemus\u00ed pokr\u00fdva\u0165 v\u0161etky probl\u00e9mov\u00e9 pr\u00edpady. Napr\u00edklad pri odstr\u00e1nen\u00ed tabu\u013eky sa zist\u00ed, \u017ee existuj\u00fa z\u00e1znamy v in\u00fdch tabu\u013ek\u00e1ch pod\u013ea Foreign Key, ktor\u00e9 s\u00fa spojen\u00e9 so z\u00e1znamami v odstra\u0148ovanej. Alebo pri zmene typu st\u013apca sa zist\u00ed, \u017ee nie 100% \u00fadajov m\u00f4\u017ee by\u0165 preveden\u00fdch na nov\u00fd typ. <\/p>\n<p><\/p>\n<h4 id=\"kak-reshat-1\">Ako rie\u0161i\u0165<\/h4>\n<p><\/p>\n<ul>\n<li>Nap\u00edsa\u0165 \u0161peci\u00e1lne skripty, ktor\u00e9 bud\u00fa jednokr\u00e1t aplikovan\u00e9 spolu s migr\u00e1ciou a upravia d\u00e1ta do po\u017eadovanej podoby. Toto je v\u0161eobecn\u00e1 cesta k rie\u0161eniu probl\u00e9mu s pren\u00e1\u0161an\u00edm d\u00e1t do nov\u00fdch \u0161trukt\u00far u\u017e po aplik\u00e1cii migr\u00e1ci\u00ed, ale nie\u010do podobn\u00e9 sa m\u00f4\u017ee aplikova\u0165 aj predt\u00fdm, v \u0161peci\u00e1lnych pr\u00edpadoch. Tak\u00e1to cesta v\u0161ak samozrejme nie je v\u017edy dostupn\u00e1, preto\u017ee \u00faprava d\u00e1t na \u017eiv\u00fdch serveroch m\u00f4\u017ee by\u0165 nebezpe\u010dn\u00e1, a dokonca katastrof\u00e1lna. <\/li>\n<li>In\u00e1 zlo\u017eit\u00e1 cesta \u2014 upravi\u0165 existuj\u00faci changset. Zlo\u017eitost\u00ed je to, \u017ee v\u0161etky DB, kde bol vo svojom aktu\u00e1lnom znen\u00ed u\u017e aplikovan\u00fd, bude treba obnovi\u0165. Je celkom mo\u017en\u00e9, \u017ee cel\u00fd backend t\u00edm bude n\u00faten\u00fd lok\u00e1lne na\u0161tartova\u0165 DB od nuly. <\/li>\n<li>A najuniverz\u00e1lnej\u0161ia cesta \u2014 prenies\u0165 probl\u00e9m s d\u00e1tami na prostredie v\u00fdvoj\u00e1ra s reprodukciou tej istej situ\u00e1cie a pridanie nov\u00e9ho changsetu, ktor\u00fd dovo\u013euje ob\u00eds\u0165 probl\u00e9m pred t\u00fdm, ktor\u00fd je zlomen\u00fd.<br \/>\n<img decoding=\"async\" alt=\"Ako si neubli\u017eova\u0165 pri pou\u017eit\u00ed Liquibase\" src=\"\/wp-content\/uploads\/2020\/02\/b5d28a940a7a35b6cd7a819a8e68f027.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ul>\n<p><\/p>\n<p>Celkovo, \u010d\u00edm viac je datab\u00e1za po zlo\u017een\u00ed d\u00e1t podobn\u00e1 datab\u00e1ze produk\u010dn\u00e9ho servera, t\u00fdm men\u0161ia je \u0161anca, \u017ee probl\u00e9my s migr\u00e1ciami prejd\u00fa \u010faleko. A samozrejme, predt\u00fdm, ne\u017e sa po\u0161le changset do repozit\u00e1ra, stoj\u00ed za to nieko\u013ekokr\u00e1t premyslie\u0165, \u010di to nie\u010do nerozbije. <\/p>\n<p><\/p>\n<h3 id=\"situaciya-3-liquibase-nachinaet-primenyatsya-uzhe-posle-vyhoda-v-prodakshn\">Situ\u00e1cia 3. Liquibase sa za\u010d\u00edna aplikova\u0165 u\u017e po vydan\u00ed do produkcie.<\/h3>\n<p><\/p>\n<p>Predpokladajme, \u017ee t\u00edmov\u00fd l\u00edder po\u017eiadal Peta, aby pripojil do projektu Liquibase, av\u0161ak projekt u\u017e je v produkcii a existuje u\u017e existuj\u00faca \u0161trukt\u00fara datab\u00e1zy.<\/p>\n<p><\/p>\n<p>Pod\u013ea toho je probl\u00e9m v tom, \u017ee na ak\u00fdchko\u013evek nov\u00fdch serveroch alebo strojoch v\u00fdvoj\u00e1rov sa d\u00e1ta tabuliek musia znovu vytvori\u0165 od nuly, a u\u017e existuj\u00face prostredie mus\u00ed zosta\u0165 v konzistentnom stave, pripraven\u00e9 prij\u00edma\u0165 nov\u00e9 changsety. <\/p>\n<p><\/p>\n<h4 id=\"kak-reshat-2\">Ako rie\u0161i\u0165<\/h4>\n<p><\/p>\n<p>Existuje tu nieko\u013eko ciest:<\/p>\n<p><\/p>\n<ul>\n<li>Prv\u00e1 a najzrejmej\u0161ia \u2014 ma\u0165 samostatn\u00fd skript, ktor\u00fd by mal by\u0165 aplikovan\u00fd ru\u010dne pri inicializ\u00e1cii nov\u00e9ho prostredia. <\/li>\n<li>Druh\u00e1 \u2014 menej zrejm\u00e1, ma\u0165 migr\u00e1ciu Liquibase, ktor\u00e1 sa nach\u00e1dza v inom Liquibase kontexte a aplikova\u0165 ju. Podrobnej\u0161ie o Liquibase kontexte si m\u00f4\u017eete pre\u010d\u00edta\u0165 tu: <noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/documentation\/contexts.html\">https:\/\/www.liquibase.org\/documentation\/contexts.html<\/a><\/noindex>. Celkovo ide o zauj\u00edmav\u00fd mechanizmus, ktor\u00fd m\u00f4\u017ee by\u0165 \u00faspe\u0161ne aplikovan\u00fd, napr\u00edklad na testovanie. <\/li>\n<li>Tret\u00ed pr\u00edstup pozost\u00e1va z nieko\u013ek\u00fdch krokov. Najprv mus\u00ed by\u0165 vytvoren\u00e1 migr\u00e1cia pre u\u017e existuj\u00face tabu\u013eky. Potom mus\u00ed by\u0165 aplikovan\u00e1 na nejakom prostred\u00ed a t\u00fdmto sp\u00f4sobom sa z\u00edska jej hash suma. \u010eal\u0161\u00edm krokom je inicializova\u0165 na na\u0161om nepr\u00e1zdnom serveri pr\u00e1zdne tabu\u013eky Liquibase a do tabu\u013eky s hist\u00f3riou aplikovania changsetov m\u00f4\u017eeme manu\u00e1lne vlo\u017ei\u0165 z\u00e1znam o \u201eakoby aplikovanom\u201c changsete s u\u017e existuj\u00facimi zmenami v datab\u00e1ze. Takto na u\u017e existuj\u00facom serveri za\u010dne hist\u00f3ria od verzie 2 a v\u0161etky nov\u00e9 prostredia sa bud\u00fa spr\u00e1va\u0165 identicky.<br \/>\n<img decoding=\"async\" alt=\"Ako si neubli\u017eova\u0165 pri pou\u017eit\u00ed Liquibase\" src=\"\/wp-content\/uploads\/2020\/02\/78881ee56a6ee3ba4e0cd1089598c3c7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"situaciya-4-migracii-stanovyatsya-ogromnymi-i-ne-uspevayut-vypolnyatsya\">Situ\u00e1cia 4. Migr\u00e1cie sa st\u00e1vaj\u00fa obrovsk\u00fdmi a nest\u00edhaj\u00fa sa vykon\u00e1va\u0165.<\/h3>\n<p><\/p>\n<p>Na za\u010diatku v\u00fdvoja slu\u017eby sa zvy\u010dajne Liquibase pou\u017e\u00edva ako extern\u00e1 z\u00e1vislos\u0165 a v\u0161etky migr\u00e1cie sa spracov\u00e1vaj\u00fa pri \u0161tarte aplik\u00e1cie. Av\u0161ak s \u010dasom sa m\u00f4\u017eete stretn\u00fa\u0165 s nasleduj\u00facimi situ\u00e1ciami:<\/p>\n<p><\/p>\n<ul>\n<li>Migr\u00e1cie sa st\u00e1vaj\u00fa obrovsk\u00fdmi a vykon\u00e1vaj\u00fa sa dlh\u00fd \u010das.<\/li>\n<li>Objavuje sa potrebnos\u0165 migrova\u0165 v distribuovan\u00fdch prostrediach, povedzme, na nieko\u013ek\u00fdch in\u0161tanci\u00e1ch serverov DB s\u00fa\u010dasne.<br \/>\nV takom pr\u00edpade pr\u00edli\u0161 dlh\u00e9 aplikovanie migr\u00e1ci\u00ed povedie k timeoutu pri \u0161tarte aplik\u00e1cie. Okrem toho aplikovanie migr\u00e1ci\u00ed pre ka\u017ed\u00fa in\u0161tanciu aplik\u00e1cie osobitne m\u00f4\u017ee vies\u0165 k tomu, \u017ee r\u00f4zne servery sa ocitn\u00fa v nesynchronizovanom stave. <\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"kak-reshat-3\">Ako rie\u0161i\u0165<\/h4>\n<p><\/p>\n<p>V tak\u00fdchto pr\u00edpadoch je v\u00e1\u0161 projekt u\u017e ve\u013ek\u00fd, mo\u017eno dokonca dospel\u00fd, a Liquibase za\u010d\u00edna vystupova\u0165 ako samostatn\u00fd extern\u00fd n\u00e1stroj. Faktom je, \u017ee Liquibase ako kni\u017enica je zabalen\u00e1 do jar s\u00faboru a m\u00f4\u017ee pracova\u0165 ako z\u00e1vislos\u0165 v r\u00e1mci projektu, tak aj samostatne. <\/p>\n<p><\/p>\n<p>V samostatnom re\u017eime m\u00f4\u017eete prenies\u0165 aplikovanie migr\u00e1ci\u00ed na va\u0161e CI\/CD prostredie alebo na siln\u00e9 plecia va\u0161ich syst\u00e9mov\u00fdch administr\u00e1torov, \u0161pecialistov na nasadzovanie. Na to potrebujete pr\u00edkazov\u00fd riadok Liquibase. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/documentation\/command_line.html\">https:\/\/www.liquibase.org\/documentation\/command_line.html<\/a><\/noindex>. V takom re\u017eime vznik\u00e1 mo\u017enos\u0165 spusti\u0165 aplik\u00e1ciu u\u017e po tom, \u010do boli vykonan\u00e9 v\u0161etky potrebn\u00e9 migr\u00e1cie.<\/p>\n<p><\/p>\n<h2 id=\"vyvod\">Z\u00e1ver<\/h2>\n<p><\/p>\n<p>Skuto\u010dne existuje ove\u013ea viac pasc\u00ed pri pr\u00e1ci s migr\u00e1ciami datab\u00e1z a mnoh\u00e9 z nich si vy\u017eaduj\u00fa kreat\u00edvny pr\u00edstup. Je d\u00f4le\u017eit\u00e9 ch\u00e1pa\u0165, \u017ee ak n\u00e1stroj spr\u00e1vne vyu\u017eijete, v\u00e4\u010d\u0161inu t\u00fdchto pasc\u00ed dok\u00e1\u017eete ob\u00eds\u0165. Osobne som sa stretol so v\u0161etk\u00fdmi uveden\u00fdmi probl\u00e9mami na r\u00f4znych \u00farovniach, a niektor\u00e9 z nich boli v\u00fdsledkom mojich ch\u00fdb. V\u00e4\u010d\u0161inou sa to deje samozrejme z nepozornosti, ale niekedy aj kv\u00f4li krimin\u00e1lnej ne\u0161ikovnosti pri pou\u017e\u00edvan\u00ed n\u00e1stroja.<\/p>\n<p>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/epam_systems\/blog\/489198\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u044b\u043b\u043e, \u0438 \u0432\u043e\u0442 \u043e\u043f\u044f\u0442\u044c! \u041d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Liquibase \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c. \u041a\u0430\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u043d\u0435 \u0432\u0441\u0435 \u043c\u043e\u043b\u043e\u0434\u044b\u0435 \u0447\u043b\u0435\u043d\u044b \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0443\u043c\u0435\u044e\u0442 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. \u042f \u043f\u0440\u043e\u0432\u0451\u043b \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0432\u043e\u0440\u043a\u0448\u043e\u043f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0442\u0435\u043c \u0440\u0435\u0448\u0438\u043b \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0432 \u0441\u0442\u0430\u0442\u044c\u044e. \u0421\u0442\u0430\u0442\u044c\u044f \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u043e\u0432\u0435\u0442\u044b \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0440\u0435\u0445 \u0441\u0430\u043c\u044b\u0445 \u044f\u0432\u043d\u044b\u0445 \u043b\u043e\u0432\u0443\u0448\u0435\u043a, \u0432 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":70974,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-70973","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.4 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u044b\u043b\u043e, \u0438 \u0432\u043e\u0442 \u043e\u043f\u044f\u0442\u044c! \u041d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Liquibase \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/kak-ne-vystrelit-sebe-v-nogu-ispolzuya-liquibase\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sk_SK\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u0430\u043a \u043d\u0435 \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0432 \u043d\u043e\u0433\u0443, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f Liquibase | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u044b\u043b\u043e, \u0438 \u0432\u043e\u0442 \u043e\u043f\u044f\u0442\u044c! \u041d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Liquibase \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/kak-ne-vystrelit-sebe-v-nogu-ispolzuya-liquibase\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-22T21:58:26+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-03T13:14:41+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Ako si nevystreli\u0165 do vlastnej nohy pri pou\u017e\u00edvan\u00ed Liquibase | ProHoster","description":"Nikdy nebolo, a znova je to tu! Na \u010fal\u0161om projekte sme sa rozhodli pou\u017ei\u0165 Liquibase od za\u010diatku, aby sme predi\u0161li probl\u00e9mom v bud\u00facnosti.","canonical_url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/kak-ne-vystrelit-sebe-v-nogu-ispolzuya-liquibase","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sk_SK","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u0430\u043a \u043d\u0435 \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0432 \u043d\u043e\u0433\u0443, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f Liquibase | ProHoster","og:description":"\u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u044b\u043b\u043e, \u0438 \u0432\u043e\u0442 \u043e\u043f\u044f\u0442\u044c! \u041d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Liquibase \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c.","og:url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/kak-ne-vystrelit-sebe-v-nogu-ispolzuya-liquibase","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-02-22T21:58:26+00:00","article:modified_time":"2020-03-03T13:14:41+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"70973","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:10:24","updated":"2022-09-28 08:39:22","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/70973","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/comments?post=70973"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/70973\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media\/70974"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=70973"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=70973"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=70973"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}