Synchronizace struktury databáze v Nette projektech

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
chikeet
Člen | 160
+
0
-

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:

  1. 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.
  2. na jednu práci kombinujeme dva různé nástroje
  3. 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
+
+1
-

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
+
+3
-

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.