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

Python Discussion :

Comment récuperer la valeur de retour d'un numéro de séquence généré par la clause sur POstegresql


Sujet :

Python

  1. #1
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut Comment récuperer la valeur de retour d'un numéro de séquence généré par la clause sur POstegresql
    Bonjour

    Voici une question donc je ne retrouve pas la réponse .

    Le fait appel à une base POSTGRESQL via les commandes psycopg2.

    Je me connecte à la base , fait des insertion simple ... etc

    mais voila je comment lorsque j' insére une seule ligne dans la table, de récuperer le numéro de séquence généré par la clause DEFAULT retouner par cette INSERT

    soit cette insert
    INSERT INTO distributors (did, dname) VALUES (DEFAULT, 'XYZ Widgets')
    RETURNING did;


    soit cette version ou l'index est normalement autogénérer par la séquece affecté à la table
    INSERT INTO distributors ( dname) VALUES ( 'XYZ Widgets')
    RETURNING did;


    or je ne retrouve pas d'exemple

    exemple de table

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE public.distributors (
    	did bigserial NOT NULL,
    	dname VARCHAR(150) NOT NULL,
    	CONSTRAINT did_pk PRIMARY KEY (did)
    )
    WITH (
    	OIDS=FALSE
    ) ;

    La table génére donc la séquence pae defaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    -- DROP SEQUENCE public.distributors_did_seq;
     
    CREATE SEQUENCE public.distributors_did_seq
    	INCREMENT BY 1
    	MINVALUE 1
    	MAXVALUE 9223372036854775807;


    l'insertion ce réalise donc


    Code : 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
    import psycopg2                                # Accés PostgreSQL
    import psycopg2.extras                        # Goodies PostgreSQL
    from  config import Config
     
     
     
    if __name__ == '__main__':
     
        conn = psycopg2.connect(host="localhost",database="suppliers", user="postgres", password="postgres")
        cur = conn.cursor()
        sql ='''INSERT INTO public.distributors
                    (dname)
                    VALUES (  %s  )
                     RETURNING did;  
                '''
        value1 ="CAS12"
        cur.execute(sql, (value1))
     
     
        conn.commit()
        conn.close()
    Comment puis-je recuperer la valeur de did génére par RETURNING en POSTGRESSQL

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Un peu de recherche sur Internet vous indiquerait que cursor.fetchone()[0] devrait retourner cela à moins que les développeurs de psycopg2 aient eu la bonne idée de se conformer à l'extension lastrowid proposée par PEP249.
    note: à vous de tester.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut sqlite3. POSTGRESQL
    Bonjour ,

    En quoi un lien sur sqlite3 peu permettre d'interpréte des appel à une base POSTGRESQL?
    est comment peut-il retourne la valeur de RETURNING ?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par dedalios Voir le message
    En quoi un lien sur sqlite3 peu permettre d'interpréte des appel à une base POSTGRESQL?
    est comment peut-il retourne la valeur de RETURNING ?
    Parce que sqlite3 est l'implémentation de référence de l'API Python sur le SGDB.
    psycopg2 peut la respecter ou faire le choix de retourner un tuple à aller fetcher via .fetchone() (et le documenter).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut
    bonjour

    j'ai trouver quelque chose

    effectivement cur.fetchone()[0] retourne les informations de la commande RETURNING que POSTGRESQL propose lors de l'insert.
    Attention j'ai réaliser ce test avec POSTGRESQl 10.4 . je ne suis pas certain que la commande RETURNING existe sur les versions antérieur de postgresql.



    Code : 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
    # coding: utf-8  
    '''
    Created on 16 juin 2018
     
    @author: moi
    '''
    import psycopg2               # Acc�s PostgreSQL
    import psycopg2.extras        # Goodies PostgreSQL
     
    try:
     
        conn = psycopg2.connect(dbname="toto", user="toto", password="toto")
     
         cur = conn.cursor()
     
        SQlcode ="""
            INSERT INTO public.distributors
            (dname)
            VALUES('aa')
             RETURNING did;
            """
     
        try:
            cur.execute(SQlcode)
            numerosequence = cur.fetchone()[0]
            print("numero sequence:" + str(numerosequence))
            conn.commit()
     
        except psycopg2.Error as e:
            print("Opération d'insertion impossible")
            print(e)
     
        SQlcode ="""
            INSERT INTO public.distributors
            (dname)
            VALUES (  %s  )
             RETURNING did;
            """
     
        try:
            dname = 'test' 
     
            # execute the INSERT statement
            cur.execute(SQlcode, (dname,))
     
     
            numerosequence = cur.fetchone()[0]
            print("numero sequence:" + str(numerosequence))
            conn.commit()
     
        except psycopg2.Error as e:
            print("Opération d'insertion impossible")
            print(e)
     
     
        try:
            cur.execute("""SELECT did, dname
                    FROM public.distributors;""")
     
            rows = cur.fetchall()
            for row in rows:
                print("   ", row[1][1])
        except psycopg2.Error as e:
            print(" Selection impossible des données de la table distributors ")
            print(e)
     
        cur.close()
        conn.close()        
     
    except psycopg2.Error as e:
        print("Je ne parviens pas à me connecter à la base de données.")
        print(e)
    Autre information , il y a probablement des optimisations a réasliser sur ce script .

    de try/excep sur les curseurs et commit... je vous laisse juge de les ajouter

Discussions similaires

  1. Réponses: 7
    Dernier message: 06/07/2006, 15h32
  2. Débutante Comment récuperer la valeur d'un jcombobx
    Par naima2005 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 09/06/2006, 12h20
  3. Excel comment récuperer des valeurs
    Par jbidou88 dans le forum Excel
    Réponses: 2
    Dernier message: 11/05/2006, 09h27
  4. [C#][Débutant] Comment récuperer la valeur d'une colonne d'une grille
    Par Cazaux-Moutou-Philippe dans le forum Windows Forms
    Réponses: 2
    Dernier message: 30/04/2006, 05h40
  5. Comment récuperer la valeur de retour d'un .vbs
    Par FabFabFab dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 05/04/2006, 14h45

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