Insertion de nombreuses valeurs (avec les FK) dans la firebase database en utilisant LiquiBase et Spring

J’essaie d’append de nombreux enregistrements (actuellement situés dans un fichier Excel) dans ma firebase database en utilisant Liquibase (pour que je sache comment le faire pour les futures modifications de firebase database)

Mon idée était de lire le fichier Excel à l’aide de Java, puis de remplir les classes ChangeLogParameters de ma classe d’initialisation Spring comme suit:

SpringLiquibase liqui = new SpringLiquibase(); liqui.setBeanName("liquibaseBean"); liqui.setDataSource(dataSource()); liqui.setChangeLog("classpath:changelog.xml"); HashMap values = new HashMap(); values.put("line1col1", ExcelValue1); values.put("line1col2", ExcelValue2); values.put("line1col3", ExcelValue3); values.put("line2col1", ExcelValue4); values.put("line2col2", ExcelValue5); values.put("line2col3", ExcelValue6); ... liqui.setChangeLogParameters(values); 

Le problème avec cette approche est que mon fichier changelog.xml serait très étrange (et non productif)

            ...  

Y a-t-il un moyen de faire quelque chose comme ça:

 HashMap<String, ArrayList> values = new HashMap<String, ArrayList>(); values.put("col1", Column1); values.put("col2", Column2); values.put("col3", Column3); liqui.setChangeLogParameters(values);        

Ou y a-t-il un autre moyen?

EDIT: Mon option actuelle est de convertir Excel en fichier CSV et d’importer les données à l’aide de

           

avec ces fichiers CSV:

entity.csv

 SHORTNAME,DESCRIPTION nome1,descricao1 nome2,descricao2 

client.csv

 DESCRIPTION,ENTITY_REFERENCE descricaoCliente1,nome1 descricaoCliente2,nome2 

Mais j’ai cette erreur:

 liquibase.exception.DatabaseException: Error executing SQL INSERT INTO `T_CLIENT` (`DESCRIPTION`, `ENTITY_REFERENCE`) VALUES ('descricaoCliente1', 'nome1'): Unknown column 'ENTITY_REFERENCE' in 'field list' 

Si je change l’en-tête de mon client.csv à DESCRIPTION, ENTITYID j’obtiens cette erreur:

 liquibase.exception.DatabaseException: Error executing SQL INSERT INTO `T_CLIENT` (`DESCRIPTION`, `ENTITYID`) VALUES ('descricaoCliente1', 'nome1'): Incorrect integer value: 'nome1' for column 'entityid' at row 1 

Dans tous les cas, il semble que defaultValueComputed ne fonctionne pas de la même manière que valueComputed dans l’exemple suivant

   nome1 descricao1    descricaoCliente   

Est-ce le comportement attendu? Bug de LiquiBase? Ou juste moi faire quelque chose de mal (le plus probable)?

Ou existe-t-il un autre moyen d’importer une grande quantité de données? Mais toujours en utilisant LiquiBase et / ou Spring.

EDIT2: Mon problème est que je ne peux pas insérer les données dans la deuxième table avec la clé étrangère correcte

Je dirais que Liquibase n’est pas l’outil idéal pour ce que vous voulez réaliser. Liquibase est bien adapté à la gestion de la structure de la firebase database, pas aux données de la firebase database.

Si vous souhaitez toujours utiliser Liquibase pour gérer les données, vous avez deux options (voir ici ) –

  1. Enregistrez vos instructions insert en tant que SQL et faites-y référence à partir de changelog.xml:

  2. Utilisez une classe de refactoring personnalisée à laquelle vous vous référez à partir du fichier changelog.xml, comme ceci:

    YourJavaClass lirait les enregistrements du fichier CSV et les appliquerait à la firebase database en implémentant cette méthode:

    void execute(Database database) throws CustomChangeException;

Gardez à l’esprit qu’une fois que vous avez chargé ces données via Liquibase, vous ne devez pas modifier les données du fichier, car ces modifications ne seront pas réappliquées. Si vous souhaitez y apporter des modifications, vous devrez le faire dans les modifications suivantes. Ainsi, après un certain temps, vous pourriez vous retrouver avec beaucoup de modifications de fichiers CSV / liquibase, fonctionnant toutes sur des données identiques / similaires (cela dépend de la manière dont vous utiliserez ces données – cela changera-t-il une fois inséré?).

Je vous recommande d’utiliser DBUnit pour gérer vos données de référence. C’est un outil principalement utilisé dans les tests unitaires, mais il est très mature, adapté à une utilisation en production, je dirais. Vous pouvez stocker des informations au format CSV ou XML. Je suggère d’utiliser un Spring ‘InitializingBean’ pour charger le jeu de données à partir du classpath et effectuer une opération DBUnit ‘refresh’, qui à partir des docs :

Cette opération actualise littéralement le contenu de l’dataset dans la firebase database. Cela signifie que les données des lignes existantes sont mises à jour et que les lignes non existantes sont insérées. Toutes les lignes qui existent dans la firebase database mais pas dans le jeu de données ne sont pas affectées.

Ainsi, vous pouvez conserver vos données de référence au même endroit et les append au fil du temps, de sorte qu’il n’existe qu’une seule source d’informations, qui ne soit pas divisée en plusieurs ensembles de modifications Liquibase. Garder vos jeux de données DBUnit dans le contrôle de version fournirait une capacité de trace et, en prime, les jeux de données DBUnit sont portables entre les bases de données et peuvent gérer des éléments tels que l’ordre d’insertion pour éviter les violations de clés étrangères.

Cela dépend de votre firebase database cible. Si vous utilisez un serveur Sybase ou MSSQL, vous pouvez utiliser l’ outil BCP fourni avec votre pilote installé + client. C’est le moyen le plus rapide de transférer de grandes quantités de données dans ces bases de données.

Googler autour de moi aussi j’ai trouvé ces liens …

Oracle a l’outil SQL * LOADER

MySQL a la commande LOAD DATA INFILE

Je m’attendrais à ce que chaque fournisseur de firebase database fournisse un outil décrivant le chargement en bloc de données.