Synchronizace struktury databáze v Nette projektech
- chikeet
- Člen | 160
Zdravím,
už delší dobu řešíme v týmu problém, jak nejlíp synchronizovat
změny v kódu a v databázi, abychom se nedostávali do situace, kdy nám
projekt nejede, protože aktuální db neodpovídá kódu. Strukturu nám celkem
pěkně řeší konzolové příkazy Doctrine, enumy povětšinou taky (i když
tam to občas hapruje), ale problémem zůstává třeba přidání nové role
nebo oprávnění (pokud je máme uložené v db, ale v kódu jsou na ně
odkazy).
Pro synchronizaci těchhle datových záležitostí relativně krátce
používáme Nextras\Migrations.
Nevýhodou tohohle přístupu je, že:
- obvykle si necháme vygenerovat sql v konzoli přes Doctrine a pak ho ukládáme do migrací → ruční práce, na kterou je snadné zapomenout, zkopírovat o řádek míň apod.
- na jednu práci kombinujeme dva různé nástroje
- když si pullneme z gitu změny, je třeba myslet na to, že musíme ručně spustit migrations
Prakticky všechny projekty máme na Nette, proto hledáme nějaké řešení, které by se dalo do Nette bezbolestně integrovat a ideálně umělo i upozornit, pokud se pokusíme spustit projekt s neaktuální databází. Existuje něco takového? Případně nějaký jiný přístup, který by hezky řešil tyhle problémy?
Editoval chikeet (16. 12. 2016 11:37)
- Oli
- Člen | 1215
Nestras\Migrations umí vygenerovat rozdilovy diff i do souboru. To ti řeší bod 1. Co ti to neřeší, když přes aplikaci vytvoříš nějaký záznam, tak ho musíš zkopírovat. To nevím jak řešit. Ten příkaz může vypadat nějak takhle (a rovnou se ti otevře ten soubor na prvním řádku nově vytvořeného souboru v PHPStormu):
TARGET=$(php ./www/index.php migrations:create structure add-column)
php ./www/index.php orm:schema-tool:update --dump-sql > "$TARGET"
~/PhpStorm/bin/phpstorm.sh ./ --line 1 $TARGET
Bod 3 ti řeší git. Můžeš si pověsit hook na post-update. Ten script ti může „nainstalovat“ composer. Můžeš se inspirovat třeba tady: https://github.com/…src/Composer
- Jan Tvrdík
- Nette guru | 2595
obvykle si necháme vygenerovat sql v konzoli přes Doctrine a pak ho ukládáme do migrací → ruční práce, na kterou je snadné zapomenout, zkopírovat o řádek míň apod.
Napište si test, co ověří, že to máte vždycky synchronní. Konkrétně u nás to třeba vypadá takhle
class OrmSchemaSyncTest extends DatabaseTestCase
{
/** @var Nextras\Migrations\IDiffGenerator @inject */
public $diffGenerator;
public function testSync()
{
Assert::same('', $this->diffGenerator->generateContent());
}
}
na jednu práci kombinujeme dva různé nástroje
To je v pořádku, nástroje jsou od toho, aby se kombinovali. Mít jeden univerzální nástroj na všechno je většinou špatně. Integrace Nextras Migrations & Doctrine schema generatoru byla vždycky jednoduchá (viz to co napsal @Oli), nicméně od verze 3.1.0 (v RC fázi od srpna 2016, čeká na to, až někdo napíše dokumentaci) je integrace s Doctrine přímo zabudovaná do Nextras Migrations.
Do další verze je v plánu integraci ještě výrazně vylepšit.