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

SGBD Perl Discussion :

probleme d'insertion dans une table via perl


Sujet :

SGBD Perl

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 103
    Points : 57
    Points
    57
    Par défaut probleme d'insertion dans une table via perl
    Bonjour tous le monde,

    J'ai un petit souci :
    je travaille sur mysql, mais sur phpmyadmin 5.0.51b sous serveur wampserver 2.0.
    en fait je remplis ma base a partir d un tableau excel que j'ai enregistre sous format txt, separation par tabulation
    dans ce tableau, sur chaque ligne j 'ai differentes infos :
    nom de reaction - ec -nameE-compartiment-family-type de reaction-nbgene-gene-equation

    via perl je split le fichier au niveau des tabulations et je recupere les valeurs dont j'ai besoin (ici, ec-namee-family et nbgene). j'envois ces valeurs dans la base, dans une table enzyme :
    - enzymeID : clé primaire, auto-increment
    - EC
    - nameE
    - Family
    - Nbgene

    j'ai affecté une contrainte d'unicité sur les 2 champs EC et NameE, quand j essaie de remplir la table depuis perl, j ai un message d erreur qui m indique que l'insertion a echoue car il a des entrees doubles. normal...

    mais mon probleme est : comment fait-on pour continuer l'insertion en 'sautant' les doublons ?


    merci de votre aide

  2. #2
    Membre actif Avatar de CKLN00
    Homme Profil pro
    Bioinformaticien Java/Perl
    Inscrit en
    Avril 2008
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Bioinformaticien Java/Perl
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 210
    Points : 263
    Points
    263
    Par défaut
    alors déjà ta clé primaire si c'est effectivement l'identifiant de l'enzyme il ne faut surtout pas que ça soit auto-incrément d'autre part pour éviter les doublons, si identifiant de l'enzyme permet effectivement d'identifier une enzyme unique, alors tu n'as qu'a remplir une table de hashage avec en clé les EnzymeID et en valeur un tableau (enfin une référence à un tableau) qui lui contiens toute les autres informations

    pour les détailles techniques je te conseille la Perl elle est bien construite (regarde au niveau des liste associative et puis des référence)
    CKL
    N°°b forever
    --
    may the be with you

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 103
    Points : 57
    Points
    57
    Par défaut
    bonjour,

    Je suis pas sure de tout comprendre...
    les doublons , je les évite lors de l'insertion, du fait que j'ai rajouté une contrainte d'unicité sur les champs ec et namee. ensuite tu dis de faire une table de hashage avec enzymeiD, mais nezymeID se crée uniquement lors de l'insertion dans la base (car c'est un auto-increment), hors mon insertion stoppe au bout de 2 lignes remplies, car le programme rencontre un doublon.
    et réaliser une table de hash me permettra juste de supprimer les doublons, chose que j'ai fait.. le probleme que j'ai ce que je n'arrive pas inserer mes infos, car le programme stoppe dès qu'il rencontre un doublon.

  4. #4
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 103
    Points : 57
    Points
    57
    Par défaut
    J' ai tenté de mettre un trigger afin de vérifier apres un insert que la ligne insérée n 'est pas déjà dans le tableau, mais je ne suis pas du tout sur de la syntaxe...

    $R_10= $dbh -> do("create trigger on enzyme after insert as
    if exists ( select * from inserted newNameE, newEC, newFamily where newEC = EC and newNameE = NameE)
    delete from enzyme where EC = newEC");

    mon probleme est comment au niveau du where lui dire de comparer les nouvelles valeurs insérées avec les anciennes?

  5. #5
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par juzii Voir le message
    hors mon insertion stoppe au bout de 2 lignes remplies, car le programme rencontre un doublon.
    et réaliser une table de hash me permettra juste de supprimer les doublons, chose que j'ai fait.. le probleme que j'ai ce que je n'arrive pas inserer mes infos, car le programme stoppe dès qu'il rencontre un doublon.
    A priori le problème c'est juste que le programme stoppe, ce qui signifie que DBI doit être réglé pour soulever une exception lorsque la base émet une erreur (ça se règle ça, mais comme c'est le bon comportement, garde ça comme c'est).
    Comme tu sais qu'il peut y avoir une erreur non critique avec cette requête il faut juste que tu captures l'exception avant qu'elle stoppe ton programme, avec eval { }.

    Ca va donner un truc comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    # préparation de la requête
    my $sth = ... ;
     
    eval { $sth->execute( params ); };
    if( $@ and $@ !~ "doublons" ) {
      die "Erreur inattendue : $@";
    }
    (et oui, Perl a un try/catch aussi)

    --
    Jedaï

  6. #6
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 103
    Points : 57
    Points
    57
    Par défaut
    j'ai essayé ta méthode, mais elle ne marche pas : (je suis dans une boucle qui parcoure un fichier où se trouve les infos que j'ai besoin d'insérer)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      $R_5 -> execute($EC,$NameE,$Family,$Nbgene) || die ("Failed to insert");
             $rows+=$R_5->rows();
     
     eval { $R_6_1 ->execute( $GeneID,$NameG,LAST_INSERT_ID())};
            if( $@ and $@ !~ "doublons" ) {
            die "Erreur inattendue : $@";
            }
    l'erreur se trouve au niveau du "last_insert_id". en fait j'ai besoin de récuperer la cle primaire d'une autre table, pour l'utiliser ici en tant que clé étrangere.
    mais ca ne fonctionne pas.. en fait, il faut que je remplisse 2 tables :
    enzyme :
    -enzymeID : cle primaire, auto-increment
    -num
    -nom
    -famille


    table gene :
    -Id : cle primaire, auto-increment
    - Gid
    - nG
    -enzymeID: clé étrangere

    je veux remplir la table gene, et pour cela récuperer tous les enzymeID de la table enzyme et les affecter aux nG et Gid correspondant dans la table gene.

  7. #7
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Ton code est très bizarre... D'abord tu me dis qu'il est normal que ton insertion dans la table "enzyme" échoue de temps en temps, mais tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $R_5 -> execute($EC,$NameE,$Family,$Nbgene) || die ("Failed to insert");
    Autrement dit, en cas d'échec à insérer, tu veux que ton programme "meure", c'est à dire s'arrête... Je pensais que tu avais juste mis un execute() et que tu avais réglé DBI pour mourir automatiquement en cas d'échec. Mais non, tu fais explicitement le contraire de ce que tu veux, tu pourrais m'expliquer ton raisonnement ?

    A priori, je vois mal la raison pour cette ligne : rows() est forcément 1 vu que la dernière instruction est une insertion et que si elle échoue tu tue le programme...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    eval { $R_6_1 ->execute( $GeneID,$NameG,LAST_INSERT_ID())};
            if( $@ and $@ !~ "doublons" ) {
            die "Erreur inattendue : $@";
            }
    Ok... A priori ce execute() là devrais toujours marcher, non ? Alors pourquoi l'entourer du eval que je t'ai montré !

    Bref... A priori last_insert_id() ne peut pas suffire dans ton cas, puisque l'insertion peut échouer. Donc tu devrais faire une requête pour déterminer la bonne id dans les cas où l'insertion a échoué et utiliser last_insert_id sinon.

    --
    Jedaï

  8. #8
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 103
    Points : 57
    Points
    57
    Par défaut
    oui effectivement, mon code est bizarre, en fait je me suis un peu emmelés les pinceaux.. maintenant C bon ca marche , pour ce qui est de remplir la table sans les doublons.

    eval { $R_5 ->execute( $EC,$NameE,$Family,$Nbgene)};
    if( $@ and $@ !~ "doublons" ) {
    die "Erreur inattendue : $@";

    $R_6 = $dbh -> do ("select EnzymeID from enzyme")|| die ("Failed to insert");
    $R_6_1 = execute ($GeneID,$NameG,$R_6) || die ("Failed to insert");

    mais je n'arrive toujours pas a remplir la table gene..pour ce qui est de la requete pour déterminer la bonne id je vois pas trop quel genre de requete faire?

    pour le moment, j'essaye de récuperer les id au fur et a mesure que je remplis la table enzyme et je remplis la table gene en parallele : ca ne fonctionne pas et je n'ai aucun message d'erreur

Discussions similaires

  1. Réponses: 3
    Dernier message: 15/07/2010, 13h15
  2. Réponses: 10
    Dernier message: 04/11/2008, 14h30
  3. probleme d'insertion dans une table
    Par metwa dans le forum JBuilder
    Réponses: 1
    Dernier message: 02/05/2008, 21h21
  4. probleme d'insertion dans une table
    Par metwa dans le forum JDBC
    Réponses: 3
    Dernier message: 30/04/2008, 10h38
  5. [interbase6]probleme d'insertion dans une table
    Par macadam314 dans le forum Bases de données
    Réponses: 10
    Dernier message: 22/02/2005, 14h21

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