2016-04-25 15 views
1

Ich versuche Zugweg für DB-Migrationen und Spring Stiefel flyway Unterstützung für Auto-Upgrade DB auf Antrag der Inbetriebnahme zu verwenden und anschließend wird diese Datenbank durch meine PPV SchichtCompletely Auto DB aktualisierbar Frühling Boot-Anwendung

jedoch verwendet werden, Dazu muss das Schema in der Datenbank vorhanden sein, damit die Initialisierung der primären Datenquelle erfolgreich ist. Welche Optionen stehen zur Verfügung, um ein SQL-Skript auszuführen, mit dem das erforderliche Schema erstellt wird, bevor Migrationen durchgeführt werden?

Beachten Sie, dass, wenn ich flyway gradle Plugin (und geben Sie die URL als jdbc:mysql://localhost/mysql verwenden. Es tut mir das Schema erstellen. Am mich gefragt, ob ich dies von Java-Code auf Anwendungsstart geschehen könnte.

+0

Haben Sie in [diesem Teil] gegangen (https : //docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialisation.html#howto-execute-flyway-database-migrations-on-startup o f die Dokumentation? –

+0

ja. Und ich denke, meine Frage steht immer noch. Ich würde gerne wissen, Mittel zum Erstellen von Schema und dann Flyway Migrationen beim Start der Anwendung. –

+1

Ich habe den Flugweg nicht selbst benutzt, aber erstellt eine Migration das Schema selbst nicht, wenn eine leere Datenbank gefunden wird? Wie auch immer, aus der Dokumentation, die ich gepostet habe, haben Sie auch die Spring Batch-Wahl, die genau das tut, was Sie wollen (führen Sie ein SQL-Skript bei der Initialisierung aus). Es wäre gut, wenn die flyway alles machen würde. Können Sie Ihre Frage mit der Konfiguration bearbeiten, mit der Sie gerade arbeiten? –

Antwort

0

Flyway nicht Unterstützung für die vollständige Installation bei leerem Schema, nur Migration für Migration Sie können zwar Schema/Benutzererstellungsskripts bei der ersten Migration hinzufügen, allerdings müssen Ihre Migrationsskripts dann mit sysdba/root/admin user ausgeführt werden Das aktuelle Schema wird zu Beginn jeder Migration festgelegt.

Wenn Sie Flyway verwenden, ist der einfachste Weg das Schema zu installieren zum ersten Mal manuell und führen Sie eine Baseline-Flyway-Aufgabe durch (auch manuell). Dann sind Sie bereit für die nächsten Migrationen, die automatisch durchgeführt werden.

Obwohl Flyway ein großartiges Tool für Datenbankmigrationen ist, deckt es diesen speziellen Anwendungsfall nicht gut ab (Schema wird zum ersten Mal installiert).

0

"Ich frage mich, ob ich dies aus Java-Code beim Start der Anwendung machen könnte."

Die einfache Antwort ist ja, da Flyway programmatische Konfiguration von Java-Anwendungen unterstützt. Der Ausgangspunkt in der Zugweg Dokumentation finden Sie hier

https://flywaydb.org/documentation/api/ 

flyway arbeitet mit einer Standard-JDBC-Datasource und so können Sie die Datenbank Erstellungsprozess in Java-Code und dann haben flyway das Schema Management behandeln. In vielen Umgebungen benötigen Sie wahrscheinlich zwei Schritte, da die Datenbank-/Schemaerstellung Administratorrechte für die Datenbank benötigt, während die laufende Schemaverwaltung ein Konto mit reduzierten Zugriffsrechten benötigt.

0
  • , was Sie brauchen, ist die Schnittstelle, die Migration manuell zu treten FlywayCallback

  • zu implementieren, um zu starten, von Ihnen Sie codieren können die Migrate() -Methode auf dem das Tracking flyway class

  • verwenden Migrationsprozess kann durch die MigrationInfoService() - Methode der Flugwegklasse

0

Unfo Wenn Ihre App über eine einzige Datenquelle verfügt, die das Schema erwartet, kann Flyway diese Datenquelle nicht zum Erstellen des Schemas verwenden. Sie müssen eine andere Datenquelle erstellen, die nicht an das Schema gebunden ist, und die unbeschränkte Datenquelle über eine FlywayMigrationStrategy verwenden.

In Ihrer Properties-Datei:

spring: 
    datasource: 
    url: jdbc:mysql://localhost:3306/myschema 
    bootstrapDatasource: 
    url: jdbc:mysql://localhost:3306 

In Ihrer Konfigurationsdatei:

@Bean 
@Primary 
@ConfigurationProperties("spring.datasource") 
public DataSourceProperties primaryDataSourceProperties() { 
    return new DataSourceProperties(); 
} 

@Bean 
@Primary 
@ConfigurationProperties("spring.datasource") 
public DataSource primaryDataSource() { 
    return primaryDataSourceProperties().initializeDataSourceBuilder().build(); 
} 

@Bean 
@ConfigurationProperties("spring.bootstrapDatasource") 
public DataSource bootstrapDataSource() { 
    return DataSourceBuilder.create().build(); 
} 

Und in Ihrer FlywayMigrationStrategy Datei:

@Inject 
@Qualifier("bootstrapDataSource") 
public void setBootstrapDataSource(DataSource bootstrapDataSource) { 
    this.bootstrapDataSource = bootstrapDataSource; 
} 

@Override 
public void migrate(Flyway flyway) { 
    flyway.setDataSource(bootstrapDataSource); 
    ... 
    flyway.migrate() 
}