IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration MySQL Discussion :

Créer un patch différentiel entre deux bases de données


Sujet :

Administration MySQL

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Points : 47
    Points
    47
    Par défaut Créer un patch différentiel entre deux bases de données
    Bonjour à tous.

    Je cherche un moyen de générer automatique un patch différentiel entre deux bases de sonnées.

    Je m'explique :
    On a livré une première version du projet il y a 6 mois.
    En 6 mois le site a vécu et évolué : créations de comptes utilisateurs, rédactions d'articles, etc..
    Entre temps on a développé un "lot 2" dans le quel on à modifié les tables, créée du contenu etc, ...

    Le processus de mise à jour envisagé est le suivant :
    1 ) On fait deux copies de la base de prod. A et B
    2 ) On applique des modifications sur la base B pour qu'elle corresponde au nouveau programme. (cette étape va prendre du temps ! Les modifications ne sont pas effectués directement sur la base mais par le programme..(donc, malheureusement, je ne peux pas faire mon ptit fichier patch à la mano))
    3 ) On génère le patch en ce basant sur les différences entre A et B
    4 ) On applique le patch sur la base de prod (qui a eu le temps de vivre ces propres aventures entre temps)

    D'où ma question : Comment générer un patch qui permet de mettre à jour une base de données à partir de la différence entre deux bases ?


    J'espère avoir été claire... Si vous avez des questions ou besoin de plus d'information, n'hésitez pas à demander


    Merci par avance pour votre aide,
    Et bonne année à tous

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Je dirais que le mieux serait quand même de créer une procédure SQL et/ou un programme PHP qui transférera les données de l'anciennes structure de données vers la nouvelle.

    Une fois la procédure crée, testée, débugguée, validée, tu arrêtes le site actuel, tu lances la procédure puis tu mets en ligne le nouveau site.

    Si tu veux faire ça sans arrêt du site actuel, tu auras toujours le risque qu'une donnée ne soit pas reprise.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Points : 47
    Points
    47
    Par défaut
    Du coups j'imagine que cette "procédure SQL" il va falloir que je la code à la main.........

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Ben oui ! Tu croyais que ton patch allait se créer tout seul ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre du Club
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Points : 47
    Points
    47
    Par défaut
    Ba pourquoi pas ....
    Il existe peut être des outils pour le faire ....
    Mais pour le moment je n'en ai pas trouvé ....

    Actuellement je fait un export sql des deux tables que je veux comparer et j'utilise KDiff3 pour voir les différences entre les deux.

  6. #6
    Membre du Club
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Points : 47
    Points
    47
    Par défaut
    Pour ceux que cela intéresse :

    voici un code php qui permet de trouver les différences de contenu entre deux exports de base de données.

    J'ai fait mes exports avec phpMyAdmin et les paramètres suivant:
    • Afficher les commentaires : NON
    • données seules
    • Fonction à utiliser lors de l'exportation des données : REPLACE
    • inclure les noms de colonnes dans chaque énoncé INSERT. Par exemple: INSERT INTO tbl_name (col_A,col_B,col_C) VALUES (1,2,3)

    Toutes les lignes sont donc dépendantes et ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    REPLACE INTO `nom_de_la_table` (`id`, `limitation_id`, `value`) VALUES(5865, 862, '78');
    code php.
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    <?php
    set_time_limit(0);
    ini_set('memory_limit', '2G');
     
    echo "<h1 id=top>Générateur de différentiel de base de données</h1>";
     
    $original = "p2.sql"; // export de la base de données d'origine
    $modifie = "a2.sql";  // export de la base de données modifiée
    $diff = "diff.sql";   // nom du fichier de résultat
     
    $ct_idem = 0; // Compteur des lignes présentes dans les deux fichiers
     
    $o_arr = file($original, FILE_SKIP_EMPTY_LINES); // Ou ouvre le fichier original sous forme de tableau. (comme ça on peut le parcourir)
     
    $add = file($modifie, FILE_SKIP_EMPTY_LINES); // On ouvre le fichier modifié sous forme de tableau.
     
    $del = array(); // dell est le tableau dans le quel on va ajouter les instruction de suppression des ligne qui était présente dans le fichier d'orrigine 
                    // mais qui ont été supprimé dans le fichier modifié
     
    foreach($o_arr as $i => $line){ // Pour chaque ligne du fichier d'origine
        $key = array_search($line, $add);
        if($key === null){
            //ERROR
        }
        if(!$key){ // Cette ligne était dans le fichier d'origine mais n'existe plus dans le fichier modifié
            $del[] = del($line); // On ajoute à la liste des lignes à supprimer
        }else{
            $add[$key] = ''; // Cette ligne est présente dans les deux fichiers. Elle n'est donc pas intéressante. On la neutralise.
            $ct_idem++;
        }
    }
     
    // $add ne contient plus que les lignes du fichier modifié qui n'était pas déjà présente dans le fichier d'origine.
    // Les lignes qui n'était pas dans le fichier d'origine sont toujours là.
     
    // $del contient les DELETE des lignes qui était dans le fichier d'origine mais qui n'existe plus dans le fichier modifié.
     
    // Dans la première boucle on a simplement remplacer les lignes à supprimer par des lignes vides.
    // On va maintenant les supprimer pour de bon.
    $add2 = array();
    foreach($add as $line){
        if(trim($line)){
            $add2[] = $line;
        }
    }
    $add= $add2;
     
    if (is_writable($diff)) {
     
        // 'w' Ouvre en écriture seule ; place le pointeur de fichier au début du fichier et réduit la taille du fichier à 0. Si le fichier n'existe pas, on tente de le créer.
        if (!$handle = fopen($diff, 'w')) {
            echo "Impossible d'ouvrir le fichier ($diff)";
        }else{
            if (fwrite($handle, implode('',$del)) === FALSE) {
                echo "Impossible d'écrire dans le fichier ($diff)";
            }
            if (fwrite($handle, implode('',$add)) === FALSE) {
                echo "Impossible d'écrire dans le fichier ($diff)";
            }
            fclose($handle);
        }
     
    } else {
        echo "Le fichier $diff n'est pas accessible en écriture.";
    }
     
     
     
    /* ========================================================================== */
     
    /** Transforme une instruction REPLACE en DELETE */ 
    function del($line){
        // REPLACE INTO `ezpolicy_limitation_value` (`id`, `limitation_id`, `value`) VALUES(5865, 862, '78');
     
        $p1 = strpos($line, '`')+1;
        $p2 = strpos($line, '`', $p1);
        $table = substr($line, $p1, $p2-$p1);
     
        $p3 = strpos($line, '(')+1;
        $p4 = strpos($line, ')', $p3);
        $atts = substr($line, $p3, $p4-$p3);
     
        $p5 = strpos($line, '(', $p4)+1;
        $p6 = strpos($line, ')', $p5);
        $vals = substr($line, $p5, $p6-$p5);
     
        $att_array = explode(',', $atts);
        $val_array = explode(',', $vals);
        $att_array = array_map('trim', $att_array);
        $val_array = array_map('trim', $val_array);
     
        $id_key = array_search('`id`', $att_array);
        $id = $val_array[$id_key];
     
        $del = "DELETE FROM $table WHERE id=$id;\n";
     
        return $del;
    }

Discussions similaires

  1. mapping entre deux bases de données
    Par taroudant dans le forum Format d'échange (XML, JSON...)
    Réponses: 17
    Dernier message: 03/05/2007, 19h45
  2. [MySQL] lien entre deux bases de données
    Par joshyeha dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 20/09/2006, 13h12
  3. liaison entre deux bases de données access
    Par questions dans le forum Access
    Réponses: 1
    Dernier message: 09/06/2006, 13h26
  4. Faire un lien entre deux bases de données
    Par pierce dans le forum Langage SQL
    Réponses: 1
    Dernier message: 27/01/2006, 21h29
  5. Réponses: 5
    Dernier message: 30/11/2005, 16h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo