2016-04-25 2 views
1

Je suis en train d'utiliser des voies de migration pour les migrations DB et le soutien des voies de migration de démarrage Spring pour DB auto-mise à niveau lors de l'application de démarrage et ensuite cette base de données sera utilisée par ma couche JPAcomplètement automatique DB upgradable applications démarrage Spring

Cependant cela nécessite que le schéma soit présent dans la base de données afin que l'initialisation de la source de données principale soit réussie. Quelles sont les options disponibles pour exécuter un script SQL qui créera le schéma requis avant que les migrations de survol se produisent?

Notez que si j'utilise le plugin gradle voie de migration (et donner l'URL comme jdbc:mysql://localhost/mysql. Il ne crée le schéma pour moi. Me demande si je pouvais y arriver à partir du code Java au démarrage de l'application.

+0

Avez-vous entré dans [cette partie] (https : //docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html#howto-execute-flyway-database-migrations-on-startup) o f la documentation? –

+0

oui. Et je suppose que ma question est toujours là. J'aimerai savoir comment créer un schéma et ensuite faire des migrations de voies de migration au démarrage de l'application. –

+1

Je n'ai pas utilisé moi-même la voie de migration, mais une migration ne crée-t-elle pas le schéma lui-même lorsque la base de données vide est trouvée? Quoi qu'il en soit, à partir de la documentation que j'ai posté, vous avez aussi le choix du Spring Batch, qui fait exactement ce que vous voulez (exécuter un script SQL lors de l'initialisation). Ce serait bien que la voie de migration fasse tout, cependant. Pouvez-vous modifier votre question avec la configuration que vous utilisez actuellement? –

Répondre

0

voies de migration ne Vous pouvez ajouter des scripts de création de schéma/utilisateur lors de la première migration, bien que vos scripts de migration doivent être exécutés avec l'utilisateur sysdba/root/admin et vous avez besoin d'une installation complète lorsque le schéma est vide. pour définir le schéma actuel au début de chaque migration

Si vous utilisez Flyway, la méthode la moins problématique consiste à installer le schéma pour la première fois manuellement et faire une tâche de base Flyway (également manuellement). Vous êtes alors prêt pour les prochaines migrations à effectuer automatiquement.

Bien que Flyway soit un excellent outil pour les migrations de bases de données, il ne couvre pas bien ce cas particulier (installation du schéma pour la première fois).

0

"Je me demande si je pourrais y arriver à partir du code Java au démarrage de l'application." La réponse simple est oui car Flyway supporte la configuration programmatique à partir d'applications Java. Le point de départ dans la documentation des voies de migration se trouve ici

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

voie de migration fonctionne avec une source de données JDBC standard et donc vous pouvez coder la base de données processus de création en Java et alors la voie de migration gérer la gestion du schéma. Dans de nombreux environnements, vous aurez probablement besoin de 2 étapes car la création de la base de données/schéma nécessitera des droits d'administrateur sur la base de données, tandis que la gestion de schéma en cours nécessitera un compte avec des droits d'accès réduits.

0
  • ce que vous avez besoin est d'implémenter l'interface FlywayCallback

  • afin de relancer la migration manuellement de votre code, vous pouvez utiliser la méthode sur la flyway class

  • migrate()

    suivi de la le processus de migration peut être effectué via la méthode MigrationInfoService() de la classe de voies de migration

0

rt heureusement, si votre application a une seule source de données qui s'attend à ce que le schéma existe, Flyway ne pourra pas utiliser cette source de données pour créer le schéma. Vous devez créer une autre source de données qui n'est pas liée au schéma et utiliser la source de données non bornée au moyen d'un FlywayMigrationStrategy.

Dans votre fichier de propriétés:

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

Dans votre fichier de configuration:

@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(); 
} 

Et dans votre fichier FlywayMigrationStrategy:

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

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