Partage
  • Partager sur Facebook
  • Partager sur Twitter

Mettre résultat d'une requête dan un fichier texte

Sujet résolu
    3 février 2020 à 9:53:14

    Bonjour,

    Dans la mission que je dois faire, je dois faire deux requête un peu différentes

    J'utilise PostgreSQL en ligne de commande

    J'aimerais savoir si on peut récupérer certains champ de la première requête SQL et les stockées dans un fichier texte 

    J'aimerais faire ça dans le langage python ou script bash

    Je veux récupérer 6 champs de la première requête pour les réinsérer dans la deuxième requête

    -
    Edité par VictorLcmt 4 février 2020 à 9:10:55

    • Partager sur Facebook
    • Partager sur Twitter
      3 février 2020 à 13:14:16

      Bonjour,

      Tu peux sortir le résultat d'une commande psql avec le paramètre "output" ( -o , --output , \o )

      -
      Edité par Benzouye 3 février 2020 à 13:15:59

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        3 février 2020 à 13:34:04

        D'accord mais ça va me sortir tous les champs moi j’aimerais avoir que certains champs 

        Comment l'utilisez vous en ligne de commande est ce que je pourrais avoir un exemple d'exécution d'insert into avec le -o et de l'exporter au format texte avec comme nom de fichier essaie.txt

        -
        Edité par VictorLcmt 3 février 2020 à 13:41:32

        • Partager sur Facebook
        • Partager sur Twitter
          3 février 2020 à 13:50:23

          Je ne comprends pas ...

          Tu veux faire un premier INSERT INTO, et utiliser des valeurs de ce premier pour les utiliser dans un deuxième INSERT INTO ?

          Si tu connais les valeurs pour le premier, tu les connais, les mêmes, pour le second ...

          Peux-tu préciser un peu ton contexte ? D'où proviennent les données et doivent-elles aller ? Si tu veux de l'aide, il va falloir nous donner plus d'éléments ... il est difficile de te répondre dans plus de détail ...

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            3 février 2020 à 14:23:24

            Ouai mais dans le deuxième INSERT INTO je veux réutiliser que quelques valeurs et pas tout 

            En fait ce que je veux c'est dans on premier INSERT INTO, il passe et je veux récupérer les valeurs de la commande select * from, sauf que l'id est auto incrémenté et en traute je dois récupérer cette id auto incrémenté et le mettre dans un champ du deuxième INSERT INTO

            Oui mais je ne peux pas c'est des données confidentielles, c'est une mission que mon maître de stage m'a donnée à faire 

            -
            Edité par VictorLcmt 3 février 2020 à 14:27:14

            • Partager sur Facebook
            • Partager sur Twitter
              3 février 2020 à 18:48:47

              Désolé, mais c'est toujours incompréhensible pour moi.

              VictorLcmt a écrit:

              Ouai mais dans le deuxième INSERT INTO je veux réutiliser que quelques valeurs et pas tout 

              J'ai bien compris, mais si tu as pu donner toutes les valeurs au premier insert into, tu peux n'en donner qu'une partie au deuxième, puisque tu les as ces valeurs ...

              Sans nous transmettre de données confidentielles, peux-tu montrer un exemple précis avec le code qui prépare et exécute le premier INSERT INTO, et celui qui prépare et exécute le deuxième INSERT INTO.

              D'où proviennent les données de départ ? D'un fichier texte ? d'une saisie utilisateur ? D'ailleurs ?

              VictorLcmt a écrit:

              je dois récupérer cette id auto incrémenté et le mettre dans un champ du deuxième INSERT INTO

              ça c'est avec CURRVAL() que tu vas le faire ... Sérieusement, un minimum de recherche ... Sinon tu es mal parti ...

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                4 février 2020 à 9:18:10

                Dans le premier INSERT INTO :

                INSERT INTO Article (id,nom,nombre,designation,famille) VALUES (auto_incremente,"Tournevis",23.05,"Penser à le changer","Plat")

                Dans le deuxième INSERT INTO :

                INSERT INTO Article_Update (nom,nombre,designation,famille,art_id) SELECT Article.id,Article.nom,Article.designation,Article.famille WHERE id = 4520

                Moi je voudrais aussi récupérer l'id qui à été auto_incrémente du premier insert into

                • Partager sur Facebook
                • Partager sur Twitter
                  4 février 2020 à 9:34:30

                  On ne se comprends pas ...

                  Dans ton premier INSERT INTO tu as des valeurs pour les colonnes nom, nombre, désignation et famille ... Ces valeurs te sont connues ! Donc tu peux les réutiliser dans ton deuxième INSERT INTO ... pas besoin de les récupérer ...

                  VictorLcmt a écrit:

                  je voudrais aussi récupérer l'id qui à été auto_incrémente du premier insert into

                  Là, tu ne m'as pas lu ...

                  Benzouye a écrit:

                  VictorLcmt a écrit:

                  je dois récupérer cette id auto incrémenté et le mettre dans un champ du deuxième INSERT INTO

                  ça c'est avec CURRVAL() que tu vas le faire ... Sérieusement, un minimum de recherche ... Sinon tu es mal parti ...

                  Après, si ce mécanisme doit être permanent, tu peux mettre un TRIGGER AFTER INSERT ON Article qui fait l'insertion dans Article_Update ...

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    4 février 2020 à 10:10:50

                    J'ai fait une fonction avec un trigger mais je ne vois pas comment récupérer mes valeurs, voila le début 

                    Oui il est permanent

                    CREATE OR  REPLACE FUNCTION recup_all() RETURNS TRIGGER AS

                    $BODY$

                    BEGIN

                    IF recup_id_Aticle IS NULL

                    INSERT INTO Artice_Update (id,nom,nombre,designation,recup_id_Aticle,famille) 

                    VALUES (nextval('Article_id_seq'::regclass),

                    valeur nom Artice,

                    valeur nombre Artice,

                    valeur designation Artice,

                    --ID de la table Article correspond au champ recup_id_Article de la table Article_Update

                    valeur id Artice,

                    valeur famille Article

                    END IF;

                    RETURN NEW;

                    END;

                    $BODY$

                    LANGUAGE 'plpgsql';

                    CREATE TRIGGER recup_all AFTER INSERT ON Article_Update

                    FOR EACH ROW

                    EXECUTE PROCEDURE recup_all();

                    -
                    Edité par VictorLcmt 4 février 2020 à 10:26:12

                    • Partager sur Facebook
                    • Partager sur Twitter
                      4 février 2020 à 11:01:41

                      Merci de colorer votre code à l'aide du bouton Code

                      Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton Code de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: sql;">Votre code ici</pre>.

                      Sinon, tu ne lis pas ce que j'écris, c'est énervant ...

                      Le trigger doit être placé AFTER INSERT ON Article ... là tu l'as mis AFTER INSERT ON Article_Update ...

                      Dans ta fonction tu dois simplement :

                      • insérer dans Article_Update en utilisant l'id récupéré avec currval et les données de NEW

                      La doc : https://docs.postgresql.fr/8.2/plpgsql-trigger.html

                      CREATE OR REPLACE FUNCTION recup_all() RETURNS TRIGGER AS $recup_all$
                      BEGIN
                      	INSERT INTO Artice_Update (id, nom, nombre, designation, recup_id_Aticle, famille) 
                      	VALUES (
                      		nextval( 'Article_Update_id_seq' ),
                      		NEW.nom,
                      		NEW.nombre,
                      		NEW.designation,
                      		currval( 'Article_id_seq' ),
                      		NEW.famille
                      	);
                      	RETURN NULL;
                      END;
                      $recup_all$ LANGUAGE plpgsql;
                      
                      CREATE TRIGGER recup_all AFTER INSERT OR UPDATE ON Article
                      FOR EACH ROW
                      EXECUTE PROCEDURE recup_all();

                      -
                      Edité par Benzouye 4 février 2020 à 14:44:35

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                        4 février 2020 à 11:33:48

                        Très bien merci mais j'ai une erreur qui me dit ca :

                        ERREUR:  could not open relation with OID 68565

                        -
                        Edité par Benzouye 4 février 2020 à 11:41:43

                        • Partager sur Facebook
                        • Partager sur Twitter
                          4 février 2020 à 11:43:18

                          Je ne connais pas cette erreur, mais encore une fois un peu de recherche de ta part ne te ferait pas de mal ...

                          A quel moment s'est produit l'erreur ?

                          L'erreur se présente une seule fois ou non ?

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                            4 février 2020 à 12:29:28

                            J'ai trouvé complètement autre chose mais je ne sais pas comment l'automatiser

                            CREATE OR REPLACE FUNCTION recup_all() RETURNS TRIGGER AS $recup_all$

                            DECLARE

                             id INTEGER

                            BEGIN

                                 INSERT INTO Article_Update (nom,nombre,designation,recup_id_article,famille) 

                            SELECT Article.nom,Article.nombre,Article.designation,Article.id,Article.famille WHERE id = Artickl.id

                            END;

                            $recup_all$ LANGUAGE plpgsql;

                            CREATE TRIGGER recup_all AFTER INSERT ON product_template

                            FOR EACH ROW

                            EXECUTE PROCEDURE recup_all();

                            Est ce que cette fonction fonctionnerait ?

                            • Partager sur Facebook
                            • Partager sur Twitter
                              4 février 2020 à 13:21:02

                              Merci de colorer ton code à l'aide du bouton Code

                              Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton Code de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: sql;">Votre code ici</pre>.

                              Sinon, c'est quoi cette table product_template ?

                              C'est quoi cette requête SELECT sans clause FROM ?

                              Tu joues aux apprentis sorciers ... sans vraiment comprendre ce que tu fais ...

                              -
                              Edité par Benzouye 4 février 2020 à 13:22:50

                              • Partager sur Facebook
                              • Partager sur Twitter
                              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                4 février 2020 à 13:48:30

                                Si je ne comprenais pas ce que je fait je ne poserais pas ma question sur ce forum

                                Si mais j'ai réussi a récupérer l'id que je voulais dans la table Article_Update avec cette requête INSERT INTO SELECT je voudrais juste savoir comment faire pour l'automatiser, c'est une erreur de ma part cette table product_template

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  4 février 2020 à 14:33:58

                                  Tu ne lis pas ce que j'écris ... tu viens d'épuiser mon dernier reste de patience ...

                                  Benzouye a écrit:

                                  CREATE OR REPLACE FUNCTION recup_all() RETURNS TRIGGER AS $recup_all$
                                  BEGIN
                                  	INSERT INTO Artice_Update (id, nom, nombre, designation, recup_id_Aticle, famille) 
                                  	VALUES (
                                  		nextval( 'Article_Update_id_seq' ),
                                  		NEW.nom,
                                  		NEW.nombre,
                                  		NEW.designation,
                                  		currval( 'Article_id_seq' ),
                                  		NEW.famille
                                  	);
                                  	RETURN NULL;
                                  END;
                                  $recup_all$ LANGUAGE plpgsql;
                                  
                                  CREATE TRIGGER recup_all AFTER INSERT OR UPDATE ON Article
                                  FOR EACH ROW
                                  EXECUTE PROCEDURE recup_all();

                                  Avec ce code mis en place, lorsque il y a insertion dans la table Article, la fonction recup_all se lance. Elle insère dans la table Article_Update en récupérant l'id de l'article créé, et en récupérant les données de cet article ... C'est déjà automatisé, il n'y a rien de plus à faire, ce sera exécuté pour chaque INSERT ou UPDATE sur la table Article ...

                                  -
                                  Edité par Benzouye 4 février 2020 à 14:44:22

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                    4 février 2020 à 15:30:46

                                    Merci beaucoup ça fonctionne 

                                    J'ai aussi une autre question toujours sur le même sujet de création de fonction et de trigger si je veux inséré une unité dans ma table article mais elle n'existe pas , je crée mon unité dans ma table unité avec id,nom,désignation et après je veux mettre dans la table article l'id de l'unité crée est ce que vous voyez 

                                    Si vous voulez plus de précision dites le moi 

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      4 février 2020 à 15:47:26

                                      VictorLcmt a écrit:

                                      Merci beaucoup ça fonctionne

                                      Te rends-tu compte du temps que tu as perdu et que tu m'as fais perdre juste parce que tu n'avais pas énoncé ton problème clairement, et parce qu'ensuite tu n'avais pas correctement lu mes réponses ? Il faut absolument prendre le temps de te poser avant de poster une question, te former sur ce que tu travailles, et rechercher proprement avant ...

                                      VictorLcmt a écrit:

                                      je veux inséré une unité dans ma table article mais elle n'existe pas , je crée mon unité dans ma table unité avec id,nom,désignation et après je veux mettre dans la table article l'id de l'unité crée

                                      C'est exactement ce que tu décris qu'il faut mettre en place ...

                                      Dans un premier temps, ne t'est-il pas possible de modifier ton application ? Tu dois y avoir un formulaire de création d'article avec une liste déroulante des unités existantes. Tu peux mettre à côté de cette liste déroulante un bouton "Ajouter" qui te permet de créer une nouvelle unité, et de mettre à jour la liste déroulante en fonction.

                                      Sinon, il faut en effet créer une procédure qui va englober l'insertion du nouvel article et juste avant le contrôle de l'unité donnée. Si elle existe, pas de problème pour insérer, si elle n'existe pas, alors tu insères la nouvelle unité, tu récupères son id (ça tu sais faire maintenant avec currval) et tu insères l'article en utilisant cet id ...

                                      Je te propose de te poser un peu et de digérer ce que tu viens de voir. Regarde si tu peux toucher au formulaire applicatif ou non. Si oui, développe cette amélioration, si non, commence à rédiger la procédure décrite ci-dessus et reviens la poster lorsque tu rencontres un problème. Normalement tu as tout ce qu'il te faut pour y arriver, sans oublier la documentation PostGreSQL et ton moteur de recherche préféré ...

                                      -
                                      Edité par Benzouye 4 février 2020 à 15:47:49

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                        4 février 2020 à 16:06:56

                                        Non je ne peux pas :

                                        Table article(id,nom,nombre,désignation,famille,id_unite,id_po_unite)

                                        Table Unité(id,nom,designation)

                                        Moi je voudrais faire une fonction qui se crée apres l'insertion de ma table article si l'unitée n'existe pas la crée dans la table unité et récupérer l'id pour mettre l'id crée dans les champs id_unite et id_po_unite et sinon si l'id existe alors chercher l'id de celle-ci et mettre cette id dans les champs id_unite et id_po_unite

                                        Oubliez pas que je donne des exemples mais c'est pour un projet dans un contexte professionnelle

                                        -
                                        Edité par VictorLcmt 4 février 2020 à 16:19:02

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          4 février 2020 à 16:24:47

                                          VictorLcmt a écrit:

                                          je donne des exemples mais c'est pour un projet dans un contexte professionnelle

                                          [sarcasme]Et bien demande de l'aide à ton contexte professionnel ...[/sarcasme]

                                          Plus sérieusement, si tu es en entreprise, j'espère qu'il ne te laisse pas seul sur le développement d'une application, sachant que tu n'as visiblement aucune connaissance (ou alors très très peu) en conception de base de données et en développement applicatif ...

                                          Il faudrait vraiment que tu répondes à quelques questions déjà posées plus tôt :

                                          Benzouye a écrit:

                                          D'où proviennent les données de départ ? D'un fichier texte ? d'une saisie utilisateur ? D'ailleurs ?

                                          Peux-tu au moins nous dire quelle est cette application sur laquelle tu travailles, sur laquelle tu ne peux pas agir mais pour laquelle tu peux tripoter la base de données ? C'est assez surprenant et du coup cela m'interpelle sur ton "projet" ...

                                          VictorLcmt a écrit:

                                          je voudrais faire une fonction qui se crée apres l'insertion de ma table article

                                          Si tu travailles correctement, tu as du mettre en place une contrainte de clé étrangère (foreign key) dans la table article qui t'empêche d'ajouter un article avec un id_po_unite qui n'existe pas dans la table unité.

                                          Donc tu ne peux pas insérer l'article et gérer après si l'unité existe ou non ... La mécanique serait plutôt :

                                          Benzouye a écrit:

                                          créer une procédure qui va englober l'insertion du nouvel article et juste avant le contrôle de l'unité donnée. Si elle existe, pas de problème pour insérer, si elle n'existe pas, alors tu insères la nouvelle unité, tu récupères son id (ça tu sais faire maintenant avec currval) et tu insères l'article en utilisant cet id ...

                                          J'ai encore ce goût amer de la répétition ... tu ne veux vraiment pas faire un petit effort ?

                                          Benzouye a écrit:

                                          commence à rédiger la procédure décrite ci-dessus et reviens la poster lorsque tu rencontres un problème. Normalement tu as tout ce qu'il te faut pour y arriver, sans oublier la documentation PostGreSQL et ton moteur de recherche préféré ...

                                          Suis un cours sur la conception d'une base de données (cf. ma signature) et réponds à mes questions plus haut au lieu de radoter ...

                                          -
                                          Edité par Benzouye 4 février 2020 à 16:26:27

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                            5 février 2020 à 11:04:55

                                            CREATE OR REPLACE FUNCTION ajout_uinte_ou_pas() RETURNS TRIGGER AS $ajout_uinte_ou_pas$
                                            BEGIN
                                            IF name NOT EXISTS
                                                INSERT INTO Unite (id,nom,designation)
                                                VALUES (
                                                currval('Unite_id_seq'),
                                                    NEW.nom,
                                                    NEW.designation
                                            );
                                            -- Peut on ajoute des expressions rationnelle pour dire que Unite = UNITE = UN 
                                            -- 
                                                INSERT INTO Article (id,nom,nombre,désignation,famille,id_unite,id_po_unite)
                                            VALUES (
                                                currval('Article_id_seq'),
                                            NEW.nom,
                                            NEW.nombre,
                                            NEW.designation,
                                            NEW.famille,
                                            currval('Unite_id_seq'),
                                            currval('Unite_id_seq')
                                                );
                                            ELSE IF name EXISTS
                                                INSERT INTO Article (id,nom,nombre,désignation,famille,id_unite,id_po_unite)
                                            VALUES (
                                                currval('Article_id_seq'),
                                            NEW.nom,
                                            NEW.nombre,
                                            NEW.designation,
                                            NEW.famille,
                                            currval('Unite_id_seq'),
                                            currval('Unite_id_seq')
                                            );
                                            RETURN NULL;
                                            END IF;
                                            END;
                                            $ajout_uinte_ou_pas$ LANGUAGE 'plpgsql';
                                            CREATE TRIGGER ajout_uinte_ou_pas BEFORE INSERT ON Article
                                            FOR EACH ROW
                                            EXECUTE PROCEDURE ajout_uinte_ou_pas();

                                            Est ce que cette fonction avec ce trigger ferait l'affaite

                                            -
                                            Edité par Benzouye 5 février 2020 à 11:55:01

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              5 février 2020 à 11:19:42

                                              Edit, j'ai rien dit, mais ton <pre class="brush: sql;"> n'a pas fonctionné, chercher à te servir du bouton </> en priorité si tu peux.

                                              Le code <pre class="brush: sql;">code</pre> ne fonctionne qu'a priori en mode édition HTML de ton message.

                                              -
                                              Edité par Tiffado 5 février 2020 à 11:21:49

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                5 février 2020 à 11:59:53

                                                Benzouye a écrit:

                                                Il faudrait vraiment que tu répondes à quelques questions déjà posées plus tôt :

                                                Benzouye a écrit:

                                                D'où proviennent les données de départ ? D'un fichier texte ? d'une saisie utilisateur ? D'ailleurs ?

                                                Peux-tu au moins nous dire quelle est cette application sur laquelle tu travailles, sur laquelle tu ne peux pas agir mais pour laquelle tu peux tripoter la base de données ? C'est assez surprenant et du coup cela m'interpelle sur ton "projet" ...

                                                Tu ne réponds toujours pas ...

                                                VictorLcmt a écrit:

                                                Est ce que cette fonction avec ce trigger ferait l'affaite

                                                D'où va provenir (qui va exécuter) la requête INSERT INTO qui va déclencher ce TRIGGER ?

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                                  5 février 2020 à 12:10:33

                                                  Il provienne d'un fichier texte que j'ai transformer en fichier XML 

                                                  Je travail sur phpPgAdmin et j'ai une base de données avec des droits ou je peux tout faire

                                                  Je voudrais créer un trigger avant insertion ou la procédure stockée dira si l'unité existe alors on l'insère dans la table d'article, sinon si l'unité n'existe pas, créez-la d'abord dans la table d'unité avec un id en auto incrémente qui sera la clé primaire, puis récupérez l'id de la table d'unité et mettez l'id de l'unité correspondant en clé étrangère dans la table d'article.


                                                  Table unité

                                                  CREATE TABLE unite (
                                                  id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
                                                  libelle VARCHAR(50) NOT NULL,
                                                  );

                                                  Table article

                                                  CREATE TABLE Article(
                                                  id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
                                                  Code_Article VARCHAR(255) NOT NULL
                                                  unit_id INT
                                                  uni_po_id INT
                                                  Nombre DECIMAL(5,2)
                                                  FOREIGN KEY (unit_id) REFERENCES unite(id)

                                                  Données de la table article

                                                  "az12g","Marteau",2,2,231.23
                                                  "mk125","Tournevis",1,1,257.21

                                                  Données de la table unité


                                                  1,cm
                                                  2,l
                                                  3,kj

                                                  Et si je voulais créer l'unité m

                                                  Dans la table unité, il y aura une ligne avec le message suivant "L'unité est bien ajouter", de plus faire une requête de Select pour voir si l'unité a bien été crée
                                                  4,m
                                                  L'unité à bien été ajouter
                                                  SELECT * FROM unite WHERE id = 4;

                                                  Et dans la table article ca donnéerai ca

                                                  "25lk5","Voiture",4,4,254.65

                                                  Si l'unité existe déjà, crée la ligne avec le message "l'article a été inséré avec succès" avec l'id de l'unité en base de la table unite


                                                  Je ne sais pas si je répond a vos question au début mais j'ai essayé de détailler le plus possible

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    5 février 2020 à 12:23:07

                                                    Pour moi, pas besoin de TRIGGER ici.

                                                    Soit tu fais la logique dans ton programme (Python si je me souviens bien) qui traite le XML :

                                                    • Le programme lit le nœud XML à insérer
                                                    • Il va chercher en base si l'unité existe avec SELECT id_unite FROM unite WHERE unite = "donnée provenant du nœud XML"
                                                    • Si elle existe il récupère donc son id
                                                    • Si elle n'existe pas il l'insère INSERT INTO unite ... et récupère son id avec SELECT currval('seq_id_unite')
                                                    • Maintenant qu'il a un id pour l'unité, il peut insérer l'article

                                                    Soit tu fais exactement la même logique en combinant Python et PostGreSQL.

                                                    • Le programme lit le nœud XML à insérer
                                                    • Il exécute une procédure PostGreSQL avec CALL ma_procedure_insertion

                                                    Cette procédure reprend exactement les mêmes étapes vues ci-dessus :

                                                    • Elle va chercher en base si l'unité existe avec SELECT id_unite FROM unite WHERE unite = "donnée provenant du nœud XML"
                                                    • Si elle existe elle récupère donc son id
                                                    • Si elle n'existe pas (pas d'id retourné) elle insère INSERT INTO unite ... et récupère son id avec SELECT currval('seq_id_unite')
                                                    • Maintenant qu'elle a un id pour l'unité, elle peut insérer l'article

                                                    -
                                                    Edité par Benzouye 5 février 2020 à 12:24:16

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                    Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                                      5 février 2020 à 12:56:50

                                                      Mon fichier XML, je le sort en fichier SQL, avec un INSERT INTO et du coup j'ai besoin de faire ce trigger pour savoir su l'unité et crée, le fichier que je traite c'est celui la

                                                      insert into table_article (Code_Article,Nom_Article,Nombre,id_unit,id_po_unit) values('5g8hj','Tournevis','5,10',1,1);
                                                        insert into table_article (Code_Article,Nom_Article,Nombre,id_unit,id_po_unit) values('6r9tl','Marteau','8,20',3,3);
                                                        insert into table_article (Code_Article,Nom_Article,Nombre;id_unit,id_po_unit) values('5d6ft','peinture','50,10',2,2);
                                                        insert into table_article (Code_Article,Nom_Article,Nombre,id_unit,id_po_unit) values('7ja3t','Vis 12*12,25','500,001',m,m);



                                                      Je veux crée l’unité m dans la table unité mais elle n'existe pas donc il faut l’inséré dans la table unité avec en référence l'id qui est a mettre deux fois dans le champ id_unit et id_po_unit 

                                                      ET si elle est crée aller chercher directement l'id de cette unité sans avoir à passer par la création

                                                      Je veux faire un trigger car j'ai un fichier de 50000 ligne à insérer 

                                                      Est ce que vous comprenez pourquoi j'ai envie de faire une fonction avec trigger

                                                      -
                                                      Edité par VictorLcmt 5 février 2020 à 12:59:47

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        5 février 2020 à 13:28:30

                                                        VictorLcmt a écrit:

                                                        Mon fichier XML, je le sort en fichier SQL

                                                        Je te conseille de changer cela ... au passage tu aurais simplement pu faire :

                                                        insert into table_article (Code_Article, Nom_Article, Nombre, id_unit, id_po_unit)
                                                        values 
                                                        ('5g8hj','Tournevis','5,10',1,1),
                                                        ('6r9tl','Marteau','8,20',3,3),
                                                        ('5d6ft','peinture','50,10',2,2),
                                                        ('7ja3t','Vis 12*12,25','500,001',m,m);

                                                        C'eut été plus rapide à exécuter ...

                                                        Si tu veux maintenir cela, alors transforme ta boucle Python pour qu'elle génère plutôt ceci :

                                                        CALL ma_procedure_insertion ('5g8hj','Tournevis','5,10',1,1);
                                                        CALL ma_procedure_insertion ('6r9tl','Marteau','8,20',3,3);
                                                        CALL ma_procedure_insertion ('5d6ft','peinture','50,10',2,2);
                                                        CALL ma_procedure_insertion ('7ja3t','Vis 12*12,25','500,001',m,m);

                                                        Et crée la procédure en question dans PostGreSQL comme proposé plus tôt.

                                                        Sinon, dans ton programme Python, tu parcoures le XML, je suppose dans une boucle. Dans cette boucle au lieu de créer une chaîne SQL composée d'INSERT INTO successifs, tu fais l'algorithme proposé juste avant :

                                                        Benzouye a écrit:

                                                        • Le programme lit le nœud XML à insérer
                                                        • Il va chercher en base si l'unité existe avec SELECT id_unite FROM unite WHERE unite = "donnée provenant du nœud XML"
                                                        • Si elle existe il récupère donc son id
                                                        • Si elle n'existe pas il l'insère INSERT INTO unite ... et récupère son id avec SELECT currval('seq_id_unite')
                                                        • Maintenant qu'il a un id pour l'unité, il peut insérer l'article

                                                        Je te conseille vraiment d'utiliser ce mécanisme plutôt qu'un TRIGGER, d'autant qu'il y a déjà un TRIGGER AFTER INSERT OR UPDATE sur cette même table (c'était la question de départ) ...

                                                        -
                                                        Edité par Benzouye 5 février 2020 à 13:33:51

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                        Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                                          5 février 2020 à 13:42:50

                                                          Faut il que je pose ma question dans un autre sujet

                                                          -
                                                          Edité par VictorLcmt 5 février 2020 à 14:41:53

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            5 février 2020 à 14:57:03

                                                            Ok reprenons le TRIGGER alors ...

                                                            Dès le début :

                                                            IF name NOT EXISTS

                                                            Cette variable name, d'où vient-elle ? Elle n'est pas déclarée ...

                                                            Ensuite, comment vas-tu inventer le nom et la désignation de l'unité à créer puisque lors de l'INSERT INTO tu ne connais qu'un id, la valeur passée pour id_po_unit ?

                                                            Enfin, tu ne peux pas faire INSERT INTO Article au sein d'un TRIGGER BEFORE INSERT ... Il faut simplement affecter les valeurs souhaitées à NEW ...

                                                            Au final la structure serait celle-ci :

                                                            CREATE OR REPLACE FUNCTION ajout_uinte_ou_pas() RETURNS TRIGGER AS $ajout_uinte_ou_pas$
                                                            DECLARE v_unit_id INTEGER;
                                                            BEGIN
                                                            	-- Recherche si unité existe
                                                            	SELECT INTO v_unit_id id
                                                            	FROM unite
                                                            	WHERE designation = NEW.id_po_unite;
                                                            	
                                                            	-- si existe pas
                                                            	IF v_unit_id IS NULL
                                                            		-- on crée une nouvelle unité
                                                            		INSERT INTO Unite ( id, nom, designation )
                                                            		VALUES ( nextval('Unite_id_seq'), '???', '???' );
                                                            		-- et on récupère son id
                                                            		SET v_unit_id = currval( 'Unite_id_seq' );
                                                            	END IF;
                                                            	
                                                            	-- on affecte id à NEW
                                                            	SET NEW.id_po_unite = v_unit_id;
                                                            	
                                                            	RETURN NULL;
                                                            END;
                                                            $ajout_uinte_ou_pas$ LANGUAGE 'plpgsql';
                                                            CREATE TRIGGER ajout_uinte_ou_pas BEFORE INSERT ON Article
                                                            FOR EACH ROW
                                                            EXECUTE PROCEDURE ajout_uinte_ou_pas();

                                                            Maintenant, une fois résolu le problème du nom et de la désignation, si ton fichier XML a beaucoup de lignes, je te laisse imaginer le temps de traitement de ton programme, avec tous ces INSERT INTO puis le premier TRIGGER puis le second ...

                                                            Selon le volume de données à traiter, cette logique n'est pas viable ...

                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                            Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                                              5 février 2020 à 15:06:21

                                                              Je veux bien mais comment vous faites en python pour faire la même chose je ne vois pas

                                                              Du coup on peut faire qu'une unité écrite de différentes manière peut être la même si Unité est écrit UNITÉ c'est la même unité mais l'utilisateur l'a écrite en maj alors qu'il ne voulait pas il faut aussi que je gère ça en plus du reste 

                                                              -
                                                              Edité par VictorLcmt 6 février 2020 à 9:50:22

                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              Mettre résultat d'une requête dan un fichier texte

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                              • Editeur
                                                              • Markdown