Mise à jour de tables MySQL (depuis PostgreSQL)

Réduire
X
 
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • Mise à jour de tables MySQL (depuis PostgreSQL)

    Bonjour,

    Je reprends un projet commencé il y a 3 ans. J'avais importé des données (PostgreSQL) dans des tables MySQL pour Joomla!
    Aujourd'hui, je voudrais ne pas remplacer la totalité par les données actuelles, mais simplement ajouter ce qui est nouveau et mettre à jour ce qui a pu être modifié, d'autant que sur au moins une table Postgre, il y a eu 9 mois de pertes de données (le Covid !) et que dans les données récupérées alors, j'ai celles de 6 de ces mois.

    Avec un INSERT IGNORE, je vais pouvoir ajouter ce qui manque, mais la question est celle de la mise à jour des données précédentes.
    Par exemple, certains paramètres de coût, de description, de date de modification, etc. ont pu changer dans certaines tables.
    Je ne peux pas utiliser UPDATE, et je ne vois pas comment mettre à jour les lignes modifiées.

    Puis-je faire un premier passage avec
    Code:
    INSERT IGNORE INTO `hr5i3_testaccommodation` (`id`,`name`,`description`,`price`,`weeks`,`active `) VALUES
    puis un second avec
    Code:
    REPLACE INTO `hr5i3_testaccommodation` (`id`,`name`,`description`,`price`,`weeks`,`active `) VALUES
    Logiquement, ça devrait fonctionner, mais n'est-ce pas lourd ?

    Que me conseillez-vous ?
    Merci !
    Dernière édition par RobertG à 26/06/2023, 07h20
    "Patience et longueur de temps font plus que force ni que rage..." (La Fontaine : Le Lion et le Rat) - "Il n'y a pas de problèmes; il n'y a que des solutions" (André Gide).
    MoovJla et LazyDbBackup sur www.joomxtensions.com - FaQ sur www.fontanil.info - Site pro : www.robertg-conseil.fr chez PHPNET, sites perso chez PlanetHoster + sites gérés chez PHPNET, PlanetHoster, Ionos et OVH

  • #2
    salut, quelle est la contrainte d'unicité sur la table concernée ?
    ou si tu prefere, quel est l'index sur ta table?
    Sans cela, ton insert ignore ne fonctionneras pas.

    Commentaire


    • #3
      Bonjour, l'index est sur l'ID (et parfois avec d'autres champs selon les tables), et lors de tests simulés dans phpMyAdmin, il semble que ce soit correctement pris en compte.
      "Patience et longueur de temps font plus que force ni que rage..." (La Fontaine : Le Lion et le Rat) - "Il n'y a pas de problèmes; il n'y a que des solutions" (André Gide).
      MoovJla et LazyDbBackup sur www.joomxtensions.com - FaQ sur www.fontanil.info - Site pro : www.robertg-conseil.fr chez PHPNET, sites perso chez PlanetHoster + sites gérés chez PHPNET, PlanetHoster, Ionos et OVH

      Commentaire


      • #4
        oui, l'insert ignore ajoute que les nouveaux enregistrements car ils ont un id inexistant dans la base qui doit être mise à jour.
        Ta seconde requete remplaceras touts les enregistrements, y compris ceux que tu viens de créer. Second point, il faut que tu reimportes toutes les valeurs de l'enregistrement, et non les champs qui doivent être mis à jour uniquement. Vu que tu ne peux pas mettre à jour les champs uniquement par update, l utilisation de replace est la seule autre option disponible.
        RobertG aime ceci.

        Commentaire


        • #5
          Merci de cette confirmation !

          Sans la question de cette perte de données, je me serais contenté de vider les tables et d'importer tout ce qui est nouveau.
          "Patience et longueur de temps font plus que force ni que rage..." (La Fontaine : Le Lion et le Rat) - "Il n'y a pas de problèmes; il n'y a que des solutions" (André Gide).
          MoovJla et LazyDbBackup sur www.joomxtensions.com - FaQ sur www.fontanil.info - Site pro : www.robertg-conseil.fr chez PHPNET, sites perso chez PlanetHoster + sites gérés chez PHPNET, PlanetHoster, Ionos et OVH

          Commentaire


          • #6
            Ta dernière suggestion est aussi une possibilité, si les noms des champs sont identique. tu les vide et tu reimporte tout l'existant.

            Commentaire


            • #7
              Dans ce cas, ce n'est pas possible, car il faut que j'arrive à conserver les données qui sont absentes de la sauvegarde actuelle (6 mois perdus entre septembre et mars 2020).
              Donc, j'ai soit cette solution, soit ne supprimer que les données antérieures à la date de perte, avant l'import des nouvelles.

              Je suis en train d'essayer d'écrire les nouvelles données dans un fichier texte, mais impossible d'insérer des sauts de lignes entre les différentes données.
              Le fichier est ouvert avec
              Code:
              $fichierdest = fopen($fichierimp, 'c+b');
              Les données sont ajoutées avec
              Code:
              fwrite($fichierdest, $ligne);               
              fwrite($fichierdest. '\r\n');  ​
              J'ai aussi essayé "\n" seul et "<br/>" (qui fonctionne bien avec echo pour un résultat visible sur le navigateur), mais rien à faire. J'ai aussi essayé fputs sans plus de succès. J'ai eu beau chercher, je ne trouve pas quoi faire.
              Cliquez sur l'image pour l'afficher en taille normale

Nom : Capture d’écran 2023-03-27 140131.jpg 
Affichages : 74 
Taille : 23,1 Ko 
ID : 2049616
              Dernière édition par RobertG à 27/03/2023, 13h02
              "Patience et longueur de temps font plus que force ni que rage..." (La Fontaine : Le Lion et le Rat) - "Il n'y a pas de problèmes; il n'y a que des solutions" (André Gide).
              MoovJla et LazyDbBackup sur www.joomxtensions.com - FaQ sur www.fontanil.info - Site pro : www.robertg-conseil.fr chez PHPNET, sites perso chez PlanetHoster + sites gérés chez PHPNET, PlanetHoster, Ionos et OVH

              Commentaire


              • #8
                Ah, javais pas compris ce détail. tu as essayé avec "\n" au lieu de '\r\n' ?

                Commentaire


                • #9
                  En fait, "\n" suffit, à condition d'utiliser des guillemets doubles et pas simples. Je m'y perds toujours entre simple et doubles...
                  Code:
                  fwrite($fichierdest, $ligne . "\n");
                  lefabdu51 aime ceci.
                  "Patience et longueur de temps font plus que force ni que rage..." (La Fontaine : Le Lion et le Rat) - "Il n'y a pas de problèmes; il n'y a que des solutions" (André Gide).
                  MoovJla et LazyDbBackup sur www.joomxtensions.com - FaQ sur www.fontanil.info - Site pro : www.robertg-conseil.fr chez PHPNET, sites perso chez PlanetHoster + sites gérés chez PHPNET, PlanetHoster, Ionos et OVH

                  Commentaire


                  • #10
                    Bonjour,

                    Je réactive ce sujet, car si j'ai bien pu importer dans des CSV les tables PostgreSQL pous traiter ces CSV pour en faire des SQL à utiliser dans phpMyAdmin.
                    Si la plupart des fichiers s'importent de manière simple, je rencontre des erreurs avec la table la plus importante qui concerne la compilation de données concernant les séjours.
                    D'abord, il faut que je trouve le juste moment lors du traitement PostgreSQL-->MySQL pour remplacer les apostrophes dans les champs texte d'adresse (rue de l'aubépine par exemple), ce que je fais a posteriori lors des tests actuels.
                    Mais une fois ce remplacement fait, lors de l'import dans la table MySQL, je rencontre encore des erreurs que phpMyAdmin me renvoie sous forme de messages qui manquent pour moi de clarté et de précisions, ou de trop de précision en spécifiant la position de la cause de l'erreur.

                    Et c'est là que j'aurais besoin pour le moment de vos lumières : avec quoi trouver dans le texte de requête, ce qu'il y a à la position 19527 par exemple, et m'y positionner ?
                    Il n'y a que cette info qui me permettra de corriger mon script et d'espérer arriver à importer correctement ces données lorsque le nouvel intranet MySQL Joomla! sera capable de remplacer le site actuel.
                    Merci de vos conseils !
                    "Patience et longueur de temps font plus que force ni que rage..." (La Fontaine : Le Lion et le Rat) - "Il n'y a pas de problèmes; il n'y a que des solutions" (André Gide).
                    MoovJla et LazyDbBackup sur www.joomxtensions.com - FaQ sur www.fontanil.info - Site pro : www.robertg-conseil.fr chez PHPNET, sites perso chez PlanetHoster + sites gérés chez PHPNET, PlanetHoster, Ionos et OVH

                    Commentaire


                    • #11
                      Bonjour,

                      Pour info à ceux qui chercheraient comme moi cette solution de positionnement, Notepad++ le permet.

                      Il faut que j'arrive à remplacer toutes ces apostrophes dans les noms ou adresses avant insertion des lignes dans le fichier sql et remplacement des caractères de séparation des champs dans les csv, en espérant qu'il n'y ait pas d'autres anoomalies.
                      "Patience et longueur de temps font plus que force ni que rage..." (La Fontaine : Le Lion et le Rat) - "Il n'y a pas de problèmes; il n'y a que des solutions" (André Gide).
                      MoovJla et LazyDbBackup sur www.joomxtensions.com - FaQ sur www.fontanil.info - Site pro : www.robertg-conseil.fr chez PHPNET, sites perso chez PlanetHoster + sites gérés chez PHPNET, PlanetHoster, Ionos et OVH

                      Commentaire


                      • #12
                        Bonjour,

                        J'ai eu du mal, mais il semble que je sois arrivé à la fin de la première étape.
                        Le souci est que certaines données (coût des différents services notamment) sont enregistrées dans un champ "invoice" de la table des séjours, sous une forme que j'ai du mal à comprendre. Ici par exemple, je retrouve ces coûts qu'il va falloir arriver à extraire pour en faire une requête de mise à jour !
                        {s:7:"id_stay";s:4:"2092";s:7:"id_week";s:3:"704"; s:9:"id_option";N;s:11:"id_activity";s:2:"27";}}}s :9:"adminFees";s:2:"85";s:10:"extraNight";s:2:"45" ;s:7:"busPass";s:2:"10";s:3:"tva";s:2:"-1";s:6:"nbWeek";i:2;s:10:"activities";a:1:{i:27;a: 3:{s:6:"object";O:18:"BMA\\Model\\Activity":6:{s:2 :"id";s:2:"27";s:4:"name";s:61:"Pass 4 activities (1surfing+1 excursion+ 2 activities) /week ";s:11:"description";s:0:"";s:5:"price";s:6:"110.0 0";s:5:"weeks";s:1:"1";s:6:"active";b:1;}s:5:"coun t";s:1:"2";s:5:"total";d:220;}}s:7:"options";a:0:{ }s:5:"extra";a:2:{s:4:"name";s:0:"";s:5:"price";s: 0:"";}s:9:"itemTotal";N;s:9:"agentPart";N;s:8:"sub total";N;s:7:"balance";N;s:6:"incTVA";N;s:12:"opti onsTotal";N;}','A2','2','2','12','154','5','','202 3')
                        Je crains d'avoir encore plus de difficultés que pour la conversion de base à base !
                        "Patience et longueur de temps font plus que force ni que rage..." (La Fontaine : Le Lion et le Rat) - "Il n'y a pas de problèmes; il n'y a que des solutions" (André Gide).
                        MoovJla et LazyDbBackup sur www.joomxtensions.com - FaQ sur www.fontanil.info - Site pro : www.robertg-conseil.fr chez PHPNET, sites perso chez PlanetHoster + sites gérés chez PHPNET, PlanetHoster, Ionos et OVH

                        Commentaire


                        • #13
                          Bonjour,

                          En revenant sur cette récupération de données, je viens de rencontrer un hic auquel je n'avais pas pensé : la présence de virgules dans certaines adresses, qui décalent les champs...
                          En récupérant les tables PostgreSQL, je remplace les tilde qui m'ont servi à exporter les champs par des virgules pour créer les requêtes SQL.
                          Et je viens de m'apercevoir que des virgules sont présentes dans des adresses et des commentaires de certaines lignes.
                          J'ai remplacé ces virgules par "&comma;" et je retrouve bien les 41 champs après traitement, mais un nouveau souci appataît !

                          J'ai trois champs numériques définis dans la table MySQL comme int(2) et int(5) null interdit et valeur par défaut 0. Dans la table d'origine, certaines lignes ont un ou plusieurs d'entre eux vides, ce qui m'empêche de faire un REPLACE pour mettre à jour la table, et un "INSERT IGNORE" me signale ces erreurs
                          Cliquez sur l'image pour l'afficher en taille normale

Nom : image.png 
Affichages : 63 
Taille : 33,8 Ko 
ID : 2053174
                          Si je vide la table pour tenter l'insertion de la ligne 1 seulement, dont ces trois champs sont vides, même en autorisant null, la requête d'insertion plante...
                          "Patience et longueur de temps font plus que force ni que rage..." (La Fontaine : Le Lion et le Rat) - "Il n'y a pas de problèmes; il n'y a que des solutions" (André Gide).
                          MoovJla et LazyDbBackup sur www.joomxtensions.com - FaQ sur www.fontanil.info - Site pro : www.robertg-conseil.fr chez PHPNET, sites perso chez PlanetHoster + sites gérés chez PHPNET, PlanetHoster, Ionos et OVH

                          Commentaire


                          • #14
                            Bonjour,

                            Curieusement, sur une base de mon serveur distant, je n'ai que les warnings, sans blocage de l'insertion des lignes, contrairement à ce que j'ai en local. C'est déjà ça...
                            "Patience et longueur de temps font plus que force ni que rage..." (La Fontaine : Le Lion et le Rat) - "Il n'y a pas de problèmes; il n'y a que des solutions" (André Gide).
                            MoovJla et LazyDbBackup sur www.joomxtensions.com - FaQ sur www.fontanil.info - Site pro : www.robertg-conseil.fr chez PHPNET, sites perso chez PlanetHoster + sites gérés chez PHPNET, PlanetHoster, Ionos et OVH

                            Commentaire


                            • #15
                              Autre chose : dans une boucle for() de la fonction qui traite les données provenant de PostgreSQL, une variable définissant la table en cours de traitement se vide.
                              La fonction récupère le nom du fichier provenant de PostgreSQL et permet d'en déduire le nom de la table MySQL, puis on entre dans la boucle, sans sortir de la fonction, pour traiter le contenu du fichier.
                              J'ai par exemple besoin de faire un traitement particulier sur un champ spécifique d'une table "hr5i3_fb_stay", mais dans la boucle, cette valeur non seulement se vide, mais si j'utilise un "if" sur son nom pour ce traitement supplémentaire, toutes les tables sont traitées de la même manière (je le vois avec la ligne echo !
                              Code:
                              if ($insert_table ="hr5i3_fb_stay" && $i > 0) {
                              Comment si $insertable est vide, cette condition peut-elle être vraie ?
                              Faut-il que je sorte la boucle for() dans une autre fonction en lui passant en variable les données et le nom de la table ?
                              "Patience et longueur de temps font plus que force ni que rage..." (La Fontaine : Le Lion et le Rat) - "Il n'y a pas de problèmes; il n'y a que des solutions" (André Gide).
                              MoovJla et LazyDbBackup sur www.joomxtensions.com - FaQ sur www.fontanil.info - Site pro : www.robertg-conseil.fr chez PHPNET, sites perso chez PlanetHoster + sites gérés chez PHPNET, PlanetHoster, Ionos et OVH

                              Commentaire

                              Annonce

                              Réduire
                              Aucune annonce pour le moment.

                              Partenaire de l'association

                              Réduire

                              Hébergeur Web PlanetHoster
                              Travaille ...
                              X