2017-07-25 2 views
0

Est-ce que quelqu'un a implémenté la gestion CSV pour Flyway? Il a été demandé il y a quelque temps (Flyway specific migration with csv files). Flyway le commente maintenant comme une possibilité pour MigrationResolver et MigrationExecutor, mais il ne semble pas être implémenté.Comment personnaliser Flyway afin qu'il puisse également gérer les fichiers CSV?

J'ai essayé de le faire moi-même avec Flyway 4.2, mais je ne suis pas très bon avec Java. Je suis allé jusqu'à créer mon propre pot en utilisant l'échantillon et le rendre accessible à la voie de migration. Mais comment est-ce que Flyway distingue quand utiliser le SqlMigrator et quand utiliser mon CsvMigrator? Je pensais que je devais enregistrer mon propre préfixe/suffixe (comme la question ci-dessus écrit), mais FlywayConfiguration semble être en lecture seule, au moins je n'ai vu aucun appel d'API pour le faire :(

Comment se connecter les différents résolveurs aux différents types de fichiers de migration? (.sql à la migration en utilisant Sql et .csv/.py au chargement de Csv et en exécutant des scripts python)

+0

Est-ce une question Java ou une question Python? –

+0

Je veux être en mesure d'appeler un fichier python (ou un shell) comme une étape de migration dans Flyway, qui est écrit en Java. L'API Flyway est Java ... donc je suppose que Java. – Alluir

Répondre

0

Après un peu de larmes et de sang, il semble que vienne Je ne peux pas rendre tout le code disponible car il utilise un format de fichier propriétaire, mais voici les idées principales:

  • figurationAware également, et utilisez l'implémentation setFlywayConfiguration pour cataloguer les fichiers supplémentaires que vous souhaitez gérer (par exemple, .csv). Ceci est exécuté une seule fois pendant l'exécution.
  • lors de ce catalogage je ne pouvais pas utiliser le scanner ou LoadableResources, il y a de la magie Java que je ne comprends pas. Toutes les classes et méthodes semblent être disponibles et accessibles, même en utilisant .getMethods() runtime ... mais en essayant de les appeler réellement lors d'une exécution java.lang.NoSuchMethodError et java.lang.NoClassDefFoundError. J'ai gaspillé une journée entière à ce sujet - ne faites pas cela, copiez-collez le code à partir de org.flywaydb.core.internal.util.scanner.filesystem.FileSystemScanner.
  • utilisez Set < String> au lieu de LoadableResources [], bien plus facile à utiliser, d'autant plus qu'il n'y a aucun accès à LoadableResources et que travailler avec [] était un cauchemar.
  • L'appel python/shell ira à execute(). Quelques conseils:
  • toute exception ou fawlty exitcode doit être traduit en SQLException.
  • la construction applique Java 1.6, de sorte que le nouveau ProcessBuilder (cmd) .inheritIO() ne peut pas être utilisé. Regardez ces solutions: ProcessBuilder: Forwarding stdout and stderr of started processes without blocking the main thread si vous voulez imprimer le STDOUT/STDERR.
  • pour compiler votre module, y compris des voies de migration personnalisé, clone le repo ensemble des voies de migration de git, modifier la principale pom.xml d'inclure votre module ainsi et utiliser cette commande pour compiler: « mvn install--P CommercialDBTest -P-CommandlinePlatformAssemblies - DskipTests = true "(J'ai trouvé ceci dans une autre question de stackoverflow.)
  • ce que je n'ai pas encore fait est la partie checksum, je ne sais pas encore ce que cela veut.