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

Linux Discussion :

[Bash] Tester l'existence d'une base/table/champ rempli MySQL


Sujet :

Linux

  1. #1
    Invité
    Invité(e)
    Par défaut [Bash] Tester l'existence d'une base/table/champ rempli MySQL
    Bonjour,
    J'aimerais pouvoir tester l'existence d'une base tout d'abord, pour ensuite décider de la créer ou non. J'ai fait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if [[ 'mysql -uXXXXX -pXXXX -e "USE log;"' != 0 ]];then
        echo "CREATE DATABASE log;" >> /tmp/stats.sql
    fi
    Quand la bd n'existe pas, il écrit bien dans le fichier.
    Mais quand elle existe déjà, il écrit aussi dans le fichier !

    Deuxième partie, pour tester l'existence d'une table cette fois. J'ai déjà ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if [[ 'mysql -uXXXX -pXXXXX -e "SELECT * FROM log.connexions_groupes_${annee}_${mois};"' != 0 ]];then
     
     echo "CREATE TABLE log.connexions_groupes_${annee}_${mois} (Id AUTO_INCREMENT, GroupID INTEGER, GroupName VARCHAR(30), Connections INTEGER);" >> /tmp/stats.sql
     
    fi
    Ici, bien que la table n'existe pas, il n'écrit pas non plus dans le fichier.

    Et enfin 3ème partie, pour tester si un champ est rempli ou non. J'ai fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      if [[ 'mysql -uXXXX -pXXXXX -e "SELECT Connexions FROM log.connexions_groupes_${annee}_${mois} WHERE GroupID=${groupiddata[${COUNTER}]};"' := 0 ]];then
     
       #Si le champ n'a pas encore été rempli (première fois sur le mois que le script est lancé) on insère les données
       echo "INSERT INTO connexions_groupes_${annee}_${mois} (GroupID,GroupName,Connections) VALUES(${groupiddata[${COUNTER}]},'${groupnamedata[${COUNTER}]}',$nbconnec)" >> /tmp/stats.sql
     
      else  
     
       #si le champ est déjà rempli on modifie les données
       echo "UPDATE connexions_groupes_${annee}_${mois} SET Connections=$nbconnec WHERE GroupID = ${groupiddata[${COUNTER}]};" >> /tmp/stats.sql
     
      fi
    Ici, il me fait tout le temps un update, même quand les tables n'existent pas.

    Existe-t-il une façon plus simple de tester l'existence de ces éléments ?
    Sinon, y'a t-il un moyen de rendre ce script fonctionnel ?

    Merci de votre aide.

    PS : En tant que tel, je sais que les commandes ne créent pas de SQL, mais j'ai besoin d'exporter les données dans un fichier pour les besoins du script.

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 559
    Points : 19 399
    Points
    19 399
    Par défaut
    Bonjour,

    il me semble qu'il existe une instruction mySQL if_exist TABLE (ou quelque chose dans le genre).

    regarde dans le man du shell ce qu'est une substitution de commande, car tel que c'est écrit il ne s'agit que de texte entre apostrophes.
    Si tu n'as pas besoin des fonctionnalités des doubles crochets, utilise des crochets simples.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci de ta réponse. J'ai résolu mon problème en passant par un autre chemin mais je vais aussi chercher du côté de IF EXISTS pour optimiser.

    Par ailleurs, j'ai bien écrit entre anti-quotes, c'est juste que j'avais copié-collé le code sur un autre forum (commentcamarche en l'occurence) et il m'a transformé les anti-quotes en quotes
    Voilà mes solutions :

    Pour la base et les tables, j'ai fini par rediriger les erreurs dans un fichier temporaire que je compare ensuite à l'erreur qui doit ressortir si l'élément n'existe pas.
    Base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #On crée la base si elle n'existe pas
    if [[ `mysql -uXXXXX -pXXXX -e "USE ${db};" 2> /tmp/error.logextract ; cat /tmp/error.logextract` = "ERROR 1049 (42000) at line 1: Unknown database '${db}'" ]];then
    	echo "CREATE DATABASE ${db};" >> /tmp/stats.sql
    fii
    Table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if [[ `mysql -uXXXX -pXXXXX -e "SELECT * FROM ${db}.connexions_groupes_${annee}_${mois};" 2> /tmp/error.logextract ; cat /tmp/error.logextract` = "ERROR 1146 (42S02) at line 1: Table '${db}.connexions_groupes_${annee}_${mois}' doesn't exist" ]];then
     
    	echo "CREATE TABLE connexions_groupes_2011_11 ( id INTEGER AUTO_INCREMENT, GroupID INTEGER, GroupName VARCHAR(30), Connections INTEGER, PRIMARY KEY (id));" >> /tmp/stats.sql
     
    fi
    Pour vérifier si un champ est rempli, c'est la sortie que j'ai redirigée cette fois-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    if [[ `mysql -uXXXX -pXXXX -e "SELECT Connections FROM ${db}.connexions_groupes_${annee}_${mois} WHERE GroupID=${groupiddata[${COUNTER}]};" > /tmp/error.logextract ; cat /tmp/error.logextract` = "" ]];then
     
    	#Si le champ n'a pas encore été rempli (première fois sur le mois que le script est lancé) on insère les données
    	echo "INSERT INTO connexions_groupes_${annee}_${mois} (GroupID,GroupName,Connections) VALUES(${groupiddata[${COUNTER}]},'${groupnamedata[${COUNTER}]}',$nbconnec);" >> /tmp/stats.sql
     
    else 
     
    	#si le champ est déjà rempli on modifie les données
    	echo "UPDATE connexions_groupes_${annee}_${mois} SET Connections=$nbconnec WHERE GroupID = ${groupiddata[${COUNTER}]};" >> /tmp/stats.sql
     
    fi

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 559
    Points : 19 399
    Points
    19 399
    Par défaut
    si ça s'affiche dans, et depuis, un fichier, ça devrait pouvoir être évalué directement dans le shell.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

Discussions similaires

  1. [Lazarus] Tester si une table existe dans une base Sqlite
    Par ovni76 dans le forum Lazarus
    Réponses: 7
    Dernier message: 16/10/2014, 20h54
  2. Tester l'existence d'une base Firebird
    Par yvesagha dans le forum Firebird
    Réponses: 6
    Dernier message: 03/12/2010, 11h05
  3. Tester si une table existe dans une base access
    Par codial dans le forum Bases de données
    Réponses: 6
    Dernier message: 28/03/2007, 08h39
  4. [MySQL] Tester l'existance d'une table dans une base de données
    Par méphistopheles dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 20/12/2006, 19h27
  5. [MySQL] Tester l'existence d'une base de données
    Par loukili81 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 16/05/2006, 10h40

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