← Zpět na všechny články blogu

Automatizuj, automatizuj, nebo se z toho zblázníš!

Honza Černý
Honza Černý Aktualizováno 12. 12. 2024 – 4 min. čtení
Blog

Představte si situaci: právě nahráváte úpravu aplikace a těšíte se, že to bude brnkačka. Týden na tom makáte, říkáte si, nahraju už jen jednu věc a půjdu na oběd. Ale pak přijde SQL error. Týká se změny v databázové tabulce. I kdybyste si vzpomněli na nutnost aktualizace databáze, dnes musíte ručně spustit nástroj, jako je Adminer, a manuálně zadat SQL příkazy. A teď si ale vzpomenout, co všechno se v tý databázi měnilo…

Minule jsme si ukázali, jak nahradit ruční nahrávání změněných zdrojových souborů. Dnes půjdeme o něco dál a zautomatizujeme i spouštění databázových migrací.

Počkej, databázové migrace? Tak to prrr. 

Co je databázová migrace?

Máme databázi, v ní tabulky se strukturami a daty. Začátečník si vytvoří tabulku přes nástroj jako Adminer, pracuje s ní a má vždy aktuální verzi. Když chce tabulku nahrát na server, vytvoří dump (neboli kopii) a přenese ji tam.

Ale co když v lokální databázi provedete změnu, třeba přidáte nový sloupeček? Na serveru musíte udělat totéž. Zpočátku to zvládnete ručně, ale musíte si pamatovat správné SQL příkazy a ty spustit. Jednou zapomenete, a problém je na světě.

VPS Centrum

Vyzkoušejte zdarma naši aplikaci pro správu serveru a domén. Budete si připadat jako zkušený administrátor.

Aktualizace databáze vyžaduje spuštění SQL kódu, který odpovídá změnám v kódu aplikace. Pokud máte více změn, vyplatí se je ukládat do souborů a spouštět při nasazování nové aplikace. Tento proces je užitečný pro jednotlivce, ale naprostá nutnost pro vícečlenné týmy.

Tento problém už naštěstí někdo vyřešil, jde o nástroj Nextras\Migration. Pokud jej neznáte, mrkněte na následující video, kde se o něm podrobněji rozpovídal Jan Tvrdík.

Nextras/Migration

Nástroj najdete na adrese: https://nextras.org/migrations/docs/master/. Pracuje se třemi složkami pro SQL příkazy:

  1. structures – pro SQL dotazy, které vytvářejí nebo upravují struktury tabulek.
  2. basic-data – pro data dostupná jak lokálně, tak na serveru (např. číselníky).
  3. dummy-data – testovací data pro lokální a testovací prostředí.

Instalace a integrace

Migraci nainstalujeme přes Composer a přidáme ji do Nette aplikace spolu s Contributte\Console, což je integrace Symfony\Console pro spouštění příkazů.

Instalace Contributte\Console

`composer require contributte/console`

Do konfigurace přidáme:

```

extensions: 

console: Contributte\Console\DI\ConsoleExtension(%consoleMode%)

```

Pak vytvoříme soubor ./bin/console:

```

#!/usr/bin/env php

<?php

declare(strict_types=1);

require __DIR__ . '/../vendor/autoload.php';

$bootstrap = new App\Bootstrap;

$container = $bootstrap->bootWebApplication();

$application = $container->getByType(Contributte\Console\Application::class);

// Run application.

exit($application->run());

```

Soubor nastavíme jako spustitelný:

`chmod +x ./bin/console`

Příkazem ./bin/console ověřte funkčnost:

Freelo - Nástroj na řízení úkolů a projektů

Přidej se, pozvi svůj tým a klienty, rozděl práci a sleduj, jak se úkoly dají do pohybu.

Instalace Nextras\Migration

`composer require nextras/migration`

Do konfigurace přidáme (a poupravíme):

```

extensions:
console: Contributte\Console\DI\ConsoleExtension(%consoleMode%)

     migrations: Nextras\Migrations\Bridges\NetteDI\MigrationsExtension

migrations:

    dir: %appDir%/../migrations # adresář pro migrace

    driver: mysql               # pgsql nebo mysql

    dbal: nette               # nextras, nette, doctrine nebo dibi

    withDummyData: %debugMode%

```

Po spuštění ./bin/console uvidíme nové příkazy pro migrace:

Jake příkazy na nás čekají: 

migrations:continue – budeme spouštět na serveru pro kontinuální pokračování a spuštění migrací, které ještě nebyli zahájeny.

migrations:create – provede lokální tvorbu SQL scriptů ve správné složce a s časem v názvu souboru.

migrations:reset – provede lokální reset databáze pro testovací účely.

První migrace: Vytvoření tabulky

Předpokládáme, že je aplikace připojená k databázi. Migraci vytvoříme příkazem:

`./bin/console migration:create structures 'init-article-table'`

a dostaneme odpověď:

„/CESTA_KE_SKRIPTU/app/../migrations/structures/2024-12-03-023103-init-article-table.sql“

V editoru upravíme nově vytvořený soubor a přidáme SQL kód:

```

CREATE TABLE `article` (

  `id` int NOT NULL AUTO_INCREMENT PRIMARY KEY,

  `title` varchar(100) NOT NULL,

  `content` text NOT NULL

) ENGINE='InnoDB' COLLATE 'utf8mb4_czech_ci';

```

Spustíme migraci:

`./bin/console migration:continue`

V databázi přibude tabulka article a interní tabulka migrations, která eviduje soubory migrací.

Nasazení na server

Teď už nám nic nebrání si editovat námi vytvořený deploy script a přidat pod smazání cache automatické spouštění databázových migrací.

```

./bin/console migration:continue

```

Provedené změny odešleme na server pomocí příkazu`git push origin` Migrace pak proběhne automaticky. 

V příkazové řádce uvidíme, že se spouští Deploying…

Pro potřeby ladění, nebo většího přehledu, si ve VPS Centru můžeme pročíst samostatný log konkrétního deploye.

V Admineru na serveru pak už uvidíme aktualizovanou databázi, ve které právě vznikly dvě nové tabulky, article a migrations.

A teď jak dál?

Pro úpravu databází teď nově potřebujete projít procesem migrací. Pokud se tedy rozhodnete, že přidáte nový sloupeček „published_at“, postup je následovný:

  1. Přes příkaz ./bin/console migration:create structure ‘article-with-published-at’ si necháme vygenerovat nový SQL migrační soubor.
  2. Do vytvořeného souboru přidáme SQL skript ALTER TABLE `article` ADD `published_at` datetime NULL;
  3. Spustíme migrace lokálně ./bin/console migration:continue
  4. Zaverzujeme do Gitu.
  5. Pushneme na server git push origin.
  6. A máme hotovo.

Automatizaci máte úspěšně za sebou, a nyní můžeme jít v klidu dál vyvíjet svou aplikaci!

Kdyby cokoliv, dejte nám vědět. Zatím ahój.

Zůstaňte s námi v kontaktu

Jednou za měsíc posíláme souhrn novinek. Nemusíte se bát, spamovat vás nebudeme a odhlásit se můžete kdykoliv...

Karel Dytrych
Tým Váš Hosting
Vyzkoušejte náš trial na týden zdarma

Garance 14denní záruky vrácení peněz

Vyzkoušejte server na týden zdarma

Vyzkoušet server