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:
- structures – pro SQL dotazy, které vytvářejí nebo upravují struktury tabulek.
- basic-data – pro data dostupná jak lokálně, tak na serveru (např. číselníky).
- 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ý:
- Přes příkaz
./bin/console migration:create structure ‘article-with-published-at’
si necháme vygenerovat nový SQL migrační soubor. - Do vytvořeného souboru přidáme SQL skript
ALTER TABLE `article` ADD `published_at` datetime NULL;
- Spustíme migrace lokálně
./bin/console migration:continue
- Zaverzujeme do Gitu.
- Pushneme na server
git push origin
. - 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.