Versionen von Entwickler.Migrations

Unwichtige Korrekturen ausblenden - Änderungen im Wiki Quelltext

 
 
01.04.2011 23:44 Uhr von tthelen -
Zeilen 1-2 hinzugefügt:

(:redirect 'http://docs.studip.de/develop/Entwickler/Migrations':)

 
 
12.12.2008 14:37 Uhr von tgloeggl -
Zeilen 1-2 bearbeitet:

Grundlegendes zu den Migrations:

geändert in:

Grundlegendes zu Migrations

Zeilen 5-6 bearbeitet:

Aufbau von Migrations-Skripten:

geändert in:

Aufbau von Migrations-Skripten:

Zeilen 14-15 bearbeitet:

Zur Hierarchie der Migrationsskripte:

geändert in:

Hierarchie der Migrationsskripte

Zeilen 19-20 bearbeitet:

Namensgebung:

geändert in:

Namensgebung

Zeilen 25-26 bearbeitet:

Reversible und Irreversible Migrationen:

geändert in:

Reversible und Irreversible Migrationen

Zeilen 30-31 bearbeitet:

Browser basierte Migration:

geändert in:

Browser basierte Migration

Zeilen 40-41 bearbeitet:

Kommandozeilen basierte Migration:

geändert in:

Kommandozeilen basierte Migration

Zeilen 81-82 bearbeitet:

Beispielplugin mit Migration:

geändert in:

Beispielplugin mit Migration

 
 
12.12.2008 14:35 Uhr von tgloeggl -
Zeilen 81-114 bearbeitet:

Beispielmigrationsskript:

geändert in:

Beispielplugin mit Migration: Elmar hat einfach mal ein kleines Beispiel fertiggemacht: das "DummyPlugin" (ein Plugin, da die Verwendung für die Plugin-Schnittstelle vorrangig von Interesse ist). Die Katalogstruktur des Plugins sieht folgendermaßen aus:

  DummyPlugin.class.php 
  plugin.manifest 
  sql/ 
    sql/dummy_install.sql 
    sql/dummy_uninstall.sql 
  migrations/ 
    migrations/1_test.php 
    migrations/2_foo.php 

Die SQL-Dateien unter sql definieren wie gehabt das "Grundlayout" für das Plugin und sind entsprechend als "dbscheme" (bzw. "uninstalldbscheme") im Manifest eingetragen, soweit also nichts neues. Neu hingekommen ist der Katalog migrations, der die einzelnen Deltas enthält, die von Plugin-Version zu Plugin-Version nachgezogen werden müssen (diese werden also nicht mehr in sql/dummy_install.sql abgebildet). Jeder Versionsschritt des Plugins kann beliebig viele solche Deltas ( = Migrations) besitzen. Alle Migrations sind aufsteigend numeriert, die Dateinamen folgen dabei der Konvention nummer_klassenname.php.

Jede Migration ist eine PHP-Klasse mit den Operationen up() und down(), die die jeweiligen Änderungen durchführen bzw. wieder zurücknehmen können. Als Beispiel hier der Inhalt von migrations/1_test.php:

  <? 
  class Test extends DBMigration { 
      function up () { 
          $this->db->query("INSERT INTO dummy VALUES (42, 'axel')"); 
      } 

      function down () { 
          $this->db->query("DELETE FROM dummy WHERE id = 42"); 
      } 
  } 
  ?> 

Anstatt Werte in eine Tabelle einzutragen könnte man natürlich ebenfalls neue Tabellen anlegen, Felder hinzufügen oder entfernen, Daten umwandeln oder in eine andere Tabelle kopieren, Dateien oder Kataloge anlegen, Rechte setzen usw. (es muß nichts mit der DB zu tun haben). Die Klasse im Beispiel erbt von DBMigration und besitzt daher bereits eine Verbindung zur DB in der Variablen $this->db. Wenn man das nicht braucht, sollte man stattdessen die Klasse Migration als Oberklasse verwenden.

Alles weitere passiert (bei Plugins) automatisch, d.h. beim Update eines Plugins werden - ausgehend vom aktuellen Versionsstand - alle notwendigen Änderungen (d.h. Migrations) durchgeführt bzw. bei einem Downgrade eines Plugins entsprechend wieder zurückgenommen.

PS: Wenn man möchte, kann man natürlich auch "dbscheme" und "uninstalldbscheme" im Manifest weglassen und das Anlegen der kompletten DB-Struktur für das Plugin über Migrations erledigen.

 
 
13.11.2008 13:39 Uhr von sziemke -
Zeile 53 bearbeitet:

Beispiele: Stud.IP Migrationen von 6 rückgängig machen auf 5:

geändert in:

Beispiel: Stud.IP Migrationen von 6 rückgängig machen auf 5:

 
 
13.11.2008 13:38 Uhr von sziemke -
Zeile 83 hinzugefügt:
 
 
13.11.2008 13:38 Uhr von sziemke -
Zeilen 61-62 bearbeitet:
  3 Step87ExternConfigurations Extends table extern_config and converts configurations for the external pages from INI-style files to serialised arrays stored in the database.
geändert in:
  3 Step87ExternConfigurations Extends table extern_config and converts configurations for the external pages from 
    INI-style files to serialised arrays stored in the database.
Zeilen 75-76 bearbeitet:
 16 Step00126EmbeddingFlashMovies Adds the new values EXTERNAL_FLASH_MOVIE_EMBEDDING and DOCUMENTS_EMBEDD_FLASH_MOVIES to table config.
geändert in:
 16 Step00126EmbeddingFlashMovies Adds the new values EXTERNAL_
    FLASH_MOVIE_EMBEDDING and DOCUMENTS_EMBEDD_FLASH_MOVIES to table config.
Zeilen 79-83 hinzugefügt:

Beispielmigrationsskript: Für ein Beispiel für die Migration eines Plugins gibt es hier ein kleines Zip file: Attach:dummy_plugin-v0.3.zip

 
 
13.11.2008 13:33 Uhr von sziemke -
Zeilen 1-24 bearbeitet:

Im Moment gibt es leider noch keine Dokumentation zu den Migrations. Elmar reicht das nach; bis dahin muss folgende Kopie von Elmars Forenbeitrag reichen.

––-

Ich habe jetzt einfach mal ein kleines Beispiel fertiggemacht: das "DummyPlugin" (ein Plugin, da die Verwendung für die Plugin-Schnittstelle vorrangig von Interesse ist). Die Katalogstruktur des Plugins sieht folgendermaßen aus:

  DummyPlugin.class.php 
  plugin.manifest 
  sql/ 
    sql/dummy_install.sql 
    sql/dummy_uninstall.sql 
  migrations/ 
    migrations/1_test.php 
    migrations/2_foo.php 

Die SQL-Dateien unter sql definieren wie gehabt das "Grundlayout" für das Plugin und sind entsprechend als "dbscheme" (bzw. "uninstalldbscheme") im Manifest eingetragen, soweit also nichts neues. Neu hingekommen ist der Katalog migrations, der die einzelnen Deltas enthält, die von Plugin-Version zu Plugin-Version nachgezogen werden müssen (diese werden also nicht mehr in sql/dummy_install.sql abgebildet). Jeder Versionsschritt des Plugins kann beliebig viele solche Deltas ( = Migrations) besitzen. Alle Migrations sind aufsteigend numeriert, die Dateinamen folgen dabei der Konvention nummer_klassenname.php.

Jede Migration ist eine PHP-Klasse mit den Operationen up() und down(), die die jeweiligen Änderungen durchführen bzw. wieder zurücknehmen können. Als Beispiel hier der Inhalt von migrations/1_test.php:

  <? 
  class Test extends DBMigration { 
      function up () { 
          $this->db->query("INSERT INTO dummy VALUES (42, 'axel')"); 
      } 
geändert in:

Grundlegendes zu den Migrations:

Unter Migrations versteht man den Umzug von Daten in eine andere Umgebung. Bei den Migrationen gibt es unterschiedliche Domänen. So ist eine Domäne "studip" vorhanden in der die Versionsprotokollierung von Stud.IP zu finden ist. Analog gibt es auch für jedes Plugin eine Migrationsdomäne.

Aufbau von Migrations-Skripten:

Migrationsskripte bestehen in der Grundlage aus mindestens zwei Funktionen, zu denen eine dritte, optionale, hinzu kommt.

Unbedingt erforderlich sind die Funktionen up() und down(). In up() werden die Änderungen durchgeführt und entsprechend in down() die Änderungen der up() Methode wieder rückgängig gemacht. (->siehe Irreversible Migrationen)

Die Funktion description() liefert eine Beschreibung der durchzuführenden Migration.

Zur Hierarchie der Migrationsskripte:

Grundsätzlich müssen alle Skripte die Klasse Migration erweitern. Falls Änderungen an der Datenbank durchgeführt werden sollen existiert schon eine Klasse DBMigration, die die Klasse Migration erweitert.

Namensgebung:

Die Migrations Klassen müssen fortlaufend nummeriert werden, beginnend bei 1 und sind immer ganzzahlig. Es dürfen keine Zahlensprünge größer als 1 in der Nummerierung vorhanden sein, führende Nullen dürfen verwendet werden. Für jede Domäne ist ein eigenes Verzeichnis vorhanden, in dem die Migrationsschritte abgespeichert werden müssen, damit auch nur die entsprechende Domäne darauf zugreifen kann.

Reversible und Irreversible Migrationen:

Bei reversiblen Migrationen besteht die Möglichkeit über die up() und down() Methoden immer in eine andere Version zu springen. Bei irreversiblem Migrationen verändert die up() Funktion die vorhandenen Daten derart, dass ein Aufruf der down() Funktion diese nicht wieder herstellen kann. In solchen Fällen sollte unbedingt eine Fehlerbehandlung in der down() Funktion des Migrationsschrittes erfolgen.

Browser basierte Migration:

Das web_migrate Skript unter /public/web_migrate.php benennt die Migrationsskripte eigenständig um insofern dass jeder Buchstabe der einen Unterstrich vor sich hatte in einen Großbuchstaben umgewandelt wird und die Dateiendung wird nicht mit angezeigt, Beispiel:

17_db_optimierung_kontingentierung.php –> 17 DbOptimierungKontingentierung

Außerdem ruft web_migrate automatisch die aktuelle Versionsnummer aus der Datenbank ab, vergleicht diese mit den vorhandenen Migrationsschrittnummern und listet ggfs. die noch nicht durchgeführten Schritte und die entsprechenden @@description()@ Methoden tabellarisch auf. (siehe Screenshot)

Kommandozeilen basierte Migration:

In dem Ordner /cli/ befindet sich ein Skript, das die Migrationen statt per Web-Interface über die Kommandozeile durchführt. Hier ist auch Migration der Plugins möglich, die vom Webinterface nicht unterstützt werden.

Zeilen 44-57 bearbeitet:
      function down () { 
          $this->db->query("DELETE FROM dummy WHERE id = 42"); 
      } 
  } 
  ?> 

Anstatt Werte in eine Tabelle einzutragen könnte man natürlich ebenfalls neue Tabellen anlegen, Felder hinzufügen oder entfernen, Daten umwandeln oder in eine andere Tabelle kopieren, Dateien oder Kataloge anlegen, Rechte setzen usw. (es muß nichts mit der DB zu tun haben). Die Klasse im Beispiel erbt von DBMigration und besitzt daher bereits eine Verbindung zur DB in der Variablen $this->db. Wenn man das nicht braucht, sollte man stattdessen die Klasse Migration als Oberklasse verwenden.

Alles weitere passiert (bei Plugins) automatisch, d.h. beim Update eines Plugins werden - ausgehend vom aktuellen Versionsstand - alle notwendigen Änderungen (d.h. Migrations) durchgeführt bzw. bei einem Downgrade eines Plugins entsprechend wieder zurückgenommen.

PS: Wenn man möchte, kann man natürlich auch "dbscheme" und "uninstalldbscheme" im Manifest weglassen und das Anlegen der kompletten DB-Struktur für das Plugin über Migrations erledigen.

Dummy-Plugin zum herunterladen

geändert in:

Erforderliche Parameter

  • d: Domäne (default studip)
  • m: Dateipfad zu den migrations
  • l: Nur auflisten was getan werden soll nicht migrieren
  • t: Zielmigration (0 für komplettes Reset, andernfalls Zielversionsnummer)
  • v: verbose (empfohlen)

Beispiele: Stud.IP Migrationen von 6 rückgängig machen auf 5: ./migrate.php -d studip -m ../db/migrations/ -t 5 -v

Beispiel: Ausgabe mit l Parameter: @@ ./migrate.php -d studip -l ../db/migrations/ -t 18

  3 Step87ExternConfigurations Extends table extern_config and converts configurations for the external pages from INI-style files to serialised arrays stored in the database.
  4 Step116ParticipantView creates table necessary for StEP116
  5 Step25RaumzeitMigrations modify db schema for StEP00025; see logfile in $TMP_PATH
  6 Step25RaumzeitDbConversion convert dates for StEP00025; see logfile in $TMP_PATH
  7 TableTokenClass      creates table for Token class
  8 Step117StudienModule modify db schema StEP00117 Studienmodulstrukturen; 
  9 StEP00111Admission   creates table admission groups
 10 ImageProxy           creates table image_proxy_cache and config entry EXTERNAL_IMAGE_EMBEDDING
 11 LockRules            creates table for lock rules
 12 Step120Userpic       modify existing user pictures according to Step00120
 13 RemoveFieldsFromExtermine removes expire|repeat|color|priority from table ex_termine
 14 StEP00123Admission2  modifies table seminare, adds field `admission_enable_quota`
 15 Step00129EmailRestriction Adds the new Value EMAIL_DOMAIN_RESTRICTION to table config.
 16 Step00126EmbeddingFlashMovies Adds the new values EXTERNAL_FLASH_MOVIE_EMBEDDING and DOCUMENTS_EMBEDD_FLASH_MOVIES to table config.
 17 DbOptimierungKontingentierung adds keys in admission_seminar_studiengang, admission_seminar_user and seminar_user
 18 Step00139UploadFileReorg reorganize uploaded files into sub-folders@@
 
 
15.05.2008 12:38 Uhr von eludwig -
Zeilen 7-19 bearbeitet:

DummyPlugin.class.php plugin.manifest sql/

  sql/dummy_install.sql 
  sql/dummy_uninstall.sql 

migrations/

  migrations/1_test.php 
  migrations/2_foo.php 
geändert in:
  DummyPlugin.class.php 
  plugin.manifest 
  sql/ 
    sql/dummy_install.sql 
    sql/dummy_uninstall.sql 
  migrations/ 
    migrations/1_test.php 
    migrations/2_foo.php 
Zeilen 20-34 bearbeitet:

<? class Test extends DBMigration {

    function up () { 
        $this->db->query("INSERT INTO dummy VALUES (42, 'axel')"); 
    } 

    function down () { 
        $this->db->query("DELETE FROM dummy WHERE id = 42"); 
    } 

} ?>

geändert in:
  <? 
  class Test extends DBMigration { 
      function up () { 
          $this->db->query("INSERT INTO dummy VALUES (42, 'axel')"); 
      } 

      function down () { 
          $this->db->query("DELETE FROM dummy WHERE id = 42"); 
      } 
  } 
  ?> 
 
 
15.05.2008 12:12 Uhr von mlunzena -
Zeile 47 bearbeitet:

Dummy-Plugin zum herunterladen: Attach:dummy_plugin-v0.3.zip

geändert in:

Dummy-Plugin zum herunterladen

 
 
15.05.2008 12:11 Uhr von mlunzena -
Zeile 47 bearbeitet:

PPS: Den Code des Beispiel-Plugins habe ich mal im Dateibereich hochgeladen.

geändert in:

Dummy-Plugin zum herunterladen: Attach:dummy_plugin-v0.3.zip

 
 
15.05.2008 12:10 Uhr von mlunzena -
Zeile 1 bearbeitet:

Im Moment gibt es leider noch keine Dokumentation zu den Migrations. Elmar reicht das nach; bis dahin muss folgende Kopie von Elmars Forenbeitrag reichen.

geändert in:

Im Moment gibt es leider noch keine Dokumentation zu den Migrations. Elmar reicht das nach; bis dahin muss folgende Kopie von Elmars Forenbeitrag reichen.

 
 
15.05.2008 12:10 Uhr von mlunzena -
Zeilen 1-3 bearbeitet:

Kopie von Elmars Forumsbeitrag

geändert in:

Im Moment gibt es leider noch keine Dokumentation zu den Migrations. Elmar reicht das nach; bis dahin muss folgende Kopie von Elmars Forenbeitrag reichen.

––-

 
 
15.05.2008 12:09 Uhr von mlunzena -
Zeilen 1-45 hinzugefügt:

Kopie von Elmars Forumsbeitrag

Ich habe jetzt einfach mal ein kleines Beispiel fertiggemacht: das "DummyPlugin" (ein Plugin, da die Verwendung für die Plugin-Schnittstelle vorrangig von Interesse ist). Die Katalogstruktur des Plugins sieht folgendermaßen aus:

DummyPlugin.class.php plugin.manifest sql/

  sql/dummy_install.sql 
  sql/dummy_uninstall.sql 

migrations/

  migrations/1_test.php 
  migrations/2_foo.php 

Die SQL-Dateien unter sql definieren wie gehabt das "Grundlayout" für das Plugin und sind entsprechend als "dbscheme" (bzw. "uninstalldbscheme") im Manifest eingetragen, soweit also nichts neues. Neu hingekommen ist der Katalog migrations, der die einzelnen Deltas enthält, die von Plugin-Version zu Plugin-Version nachgezogen werden müssen (diese werden also nicht mehr in sql/dummy_install.sql abgebildet). Jeder Versionsschritt des Plugins kann beliebig viele solche Deltas ( = Migrations) besitzen. Alle Migrations sind aufsteigend numeriert, die Dateinamen folgen dabei der Konvention nummer_klassenname.php.

Jede Migration ist eine PHP-Klasse mit den Operationen up() und down(), die die jeweiligen Änderungen durchführen bzw. wieder zurücknehmen können. Als Beispiel hier der Inhalt von migrations/1_test.php:

<? class Test extends DBMigration {

    function up () { 
        $this->db->query("INSERT INTO dummy VALUES (42, 'axel')"); 
    } 

    function down () { 
        $this->db->query("DELETE FROM dummy WHERE id = 42"); 
    } 

} ?>

Anstatt Werte in eine Tabelle einzutragen könnte man natürlich ebenfalls neue Tabellen anlegen, Felder hinzufügen oder entfernen, Daten umwandeln oder in eine andere Tabelle kopieren, Dateien oder Kataloge anlegen, Rechte setzen usw. (es muß nichts mit der DB zu tun haben). Die Klasse im Beispiel erbt von DBMigration und besitzt daher bereits eine Verbindung zur DB in der Variablen $this->db. Wenn man das nicht braucht, sollte man stattdessen die Klasse Migration als Oberklasse verwenden.

Alles weitere passiert (bei Plugins) automatisch, d.h. beim Update eines Plugins werden - ausgehend vom aktuellen Versionsstand - alle notwendigen Änderungen (d.h. Migrations) durchgeführt bzw. bei einem Downgrade eines Plugins entsprechend wieder zurückgenommen.

PS: Wenn man möchte, kann man natürlich auch "dbscheme" und "uninstalldbscheme" im Manifest weglassen und das Anlegen der kompletten DB-Struktur für das Plugin über Migrations erledigen.

PPS: Den Code des Beispiel-Plugins habe ich mal im Dateibereich hochgeladen.

 

 

Quelle: Basis-Wiki-Hilfe | Letzte Änderung: 01.04.2011 23:44 Uhr, tthelen | Local view: Basis-Hilfe