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

PyQt Python Discussion :

Requettes sql ajout nouvelle valeur


Sujet :

PyQt Python

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur développement de composants
    Inscrit en
    Décembre 2019
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement de composants

    Informations forums :
    Inscription : Décembre 2019
    Messages : 113
    Points : 72
    Points
    72
    Par défaut Requettes sql ajout nouvelle valeur
    Bonjour,
    j'utilise PyQt pour interagir avec une DDB (import mysql.connector).
    jusqu'à maintenant pas de souci j'avais "bien" réussi à faire communiquer chaque évènement de l'utilisateur avec la ddb... j'usqu'à ce qu'un évènement que je pensais pas "possible" arrive!

    J'ai un bouton qui doit permettre d'ajouter une ligne avec un contenu "nouveau" dont la première colonne doit être un référencement unique (les autres colonnes dépendent de données externes)
    le contenu de cette première colonne correspond à un mix de caratères de type "DT23-0002" (par exemple).
    23 correspond à l'année,
    le 0002 correspond à un incrément relatif à l'année.
    et du coup, si j'appuie successivement sur ce bouton "nouvelle ligne" je dois voir s'empiler successivement en première colonne de ma ddb:
    DT22-0022
    DT22-0023
    DT22-0024
    Etc...

    j'utilise actuellement la fonction ci dessous pour l'ajout de lignes (bon à la relecture elle ne me semble pas d'une élégance notable mais elle faisait le job):

    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
    def envoyer(self, instance_glob):
        try:
     
            cursor = instance_glob.connection.cursor()
            sql = """SELECT Num_DT FROM Data_LEIT ORDER BY Num_DT DESC LIMIT 1"""
            cursor.execute(sql)
            liste = cursor.fetchall()
            val = liste[-1][0]
            #ici je récupère la valeur de la dernière ligne de ma bdd (1ere colonne)
     
            suffixe_annee = int(str(datetime.datetime.today().year)[2:])
            suffixe_annee_last_dt = int(val[2:4])
    	partie_chiffree = int(val[-4:])
            if suffixe_annee_last_dt == suffixe_annee:
                partie_chiffree = partie_chiffree + 1
            else:
                partie_chiffree = 1
     
            if partie_chiffree < 10:
                partie_chiffree = str("000") + str(partie_chiffree)
            elif partie_chiffree < 100:
                partie_chiffree = str("00") + str(partie_chiffree)
            elif partie_chiffree < 1000:
                partie_chiffree = str("0") + str(partie_chiffree)
            else:
                partie_chiffree = str(partie_chiffree)
    	new_number = "DT" + str(suffixe_annee) + "-" + str(partie_chiffree)
     
    	base = tuple(["%s" for i in range(0, len(self.instance_glob.df.columns), 1)])
            colonnes_requette = "(Col1, Col2, Col3, Col4, Col5, Col6, Col7, Col8, Col9, Col10, Col11, Col12, Col13, Col14, Col15, Col16, Col17, Col18, Col19, Col20, Col21, Col22, Col23, Col24, Col25, Col26, Col27, Col28, Col29, Col30, Col31, Col32, Col33, Col34, Col35, Col36, Col37, Col38, Col39, Col40, Col41)"
            new_val_saisies = (Val1, Val2, Val3, Val4, Val5, Val6, Val7, Val8, Val9, Val10, Val11, Val12, Val13, Val14, Val15, Val16)
            new_val_non_saisies = ("","","","","","","","","","","","","","","","","","","","","","","","","")
            new_val = new_val_saisies + new_val_non_saisies
            new_base = str(base).replace("'","")
     
            sql = "INSERT INTO Ma_Table " + colonnes_requette + " VALUES " + new_base
            cursor.execute(sql, new_val)
            instance_glob.connection.commit()
            cursor.close()
     
        Except Exception as error:
    	print(error)
    Ce qu'il s'est passé dernièrement, c'est que je me suis retrouvé avec deux référencements identiques en première colonne! mais bien dépendant à deux lignes différentes (en contenu sur les autres colonnes)
    comment est-ce que je peux modifier le code ci dessus pour me garantir un bonne incrémentation de mes lignes (première colonne) même si différentes personnes utilisent en même temps l'interfaces?

    merci,
    cordialement,

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par clement_74 Voir le message
    comment est-ce que je peux modifier le code ci dessus pour me garantir un bonne incrémentation de mes lignes (première colonne) même si différentes personnes utilisent en même temps l'interfaces?
    Une clé primaire qui s'auto-incrémente se déclare côté SQL.
    note: vous devez savoir utiliser une base de données avant d'écrire une application qui va les utiliser...

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

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par clement_74 Voir le message
    la première colonne doit être un référencement unique
    ...
    Ce qu'il s'est passé dernièrement, c'est que je me suis retrouvé avec deux référencements identiques en première colonne!
    Impossible. Si tu déclares bien ta colonne en clé primaire (ou même en simple "contrainte unique"), le moteur bdd interdit physiquement tout doublon sur cette colonne.
    Et si cette colonne est associée à un auto incrément (ou à une séquence) alors le moteur bdd fera en sorte que chaque incrément soit attribué à une seule ligne
    Cela est inclus dans le concept ACID auquel doivent se soumettre toutes les bdd (et donc auquel est soumis la bdd MySQL)

    Citation Envoyé par clement_74 Voir le message
    comment est-ce que je peux modifier le code ci dessus pour me garantir un bonne incrémentation de mes lignes (première colonne) même si différentes personnes utilisent en même temps l'interfaces?
    D'un point de vue informatique, il n'y a absolument aucun souci et donc rien à répondre. Tu as un bouton qui incrémente un compteur, quand le bouton est pressé le compteur s'incrémente. Jusque là tout est normal.
    Si maintenant il y a des soucis "logique" par rapport à ce que tu attends, alors il te faut programmer le comportement de ton programme par rapport à ce que tu attends quand on appuie sur le bouton.

    Et tout ça n'a absolument rien à voir ni avec Python, ni avec Qt. C'est un souci soit SQL (comment créer des index, des auto-increments, des séquences) soit algorithmique (comment gérer des accès concurrents dans un environnement multi-utilisateur).
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre régulier
    Homme Profil pro
    Ingénieur développement de composants
    Inscrit en
    Décembre 2019
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement de composants

    Informations forums :
    Inscription : Décembre 2019
    Messages : 113
    Points : 72
    Points
    72
    Par défaut
    Bonjour,
    merci pour vos réponses.
    j'ai bel et bien oublié de déclarer ma colonne comme clé primaire!
    je file vers la doc côté SQL du coup pour gérer cet aspect là.
    encore merci
    cordialement

  5. #5
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 101
    Points : 4 446
    Points
    4 446
    Par défaut
    bonjour

    bien oublié de déclarer ma colonne comme clé primaire!
    boof ! On déclare comme clé primaire une colonne entier auto-incrémentée, ensuite, tu peux ajouter un champ "référence" qui lui n'est que "unique". Mais au niveau sql, il me semble plus logique d'avoir 2 champs d'entiers (annee, rand_annee) à la place et, il est possible de créer un index unique sur 2 champs.



    Citation Envoyé par clement_74 Voir le message
    à la relecture elle ne me semble pas d'une élégance notable mais elle faisait le job):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            if partie_chiffree < 10:
                partie_chiffree = str("000") + str(partie_chiffree)
            elif partie_chiffree < 100:
                partie_chiffree = str("00") + str(partie_chiffree)
    Uniquement coté python !
    Cette partie ... existe plusieurs solutions 100 fois plus simples :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    str(partie_chiffree).zfill(4))
    f"{partie_chiffree:04d}"
    $moi= ( !== ) ? : ;

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par papajoker Voir le message
    Mais au niveau sql, il me semble plus logique d'avoir 2 champs d'entiers (annee, rand_annee) à la place et, il est possible de créer un index unique sur 2 champs
    Avec 41 colonnes nommées Col1, Col2, ... difficile de croire que la création du schema de la base ait été fait sérieusement.

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

  7. #7
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 101
    Points : 4 446
    Points
    4 446
    Par défaut
    Si la base de données était bonne…


    new_number =
    Cool, tu as une nouvelle référence "unique", MAIS je ne vois aucun code qui va insérer cette valeur dans la table par la suite ???
    C'est donc ton problème immédiat.

    colonnes_requette =(col1 .. col 41)
    INSERT INTO Ma_Table +colonnes_requette
    Pourquoi insérer chaque 41 champs si la moitié est obligatoirement "vide" ?

    new_val_saisies = (Val1 .. Val16)
    D'où sortent ces variables ? elles sont globales ?
    Sans parler des noms de variable bien explicites
    Créer une tonne de variables : réflexe de débutant en programmation qu'il faut absolument casser

    Donc en résumé :
    - structure de la base de donnée à revoir (en profondeur)
    - structure du code python aussi à revoir (sans doute tout à la poubelle)
    $moi= ( !== ) ? : ;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 12
    Dernier message: 18/02/2013, 21h35
  2. Réponses: 8
    Dernier message: 06/08/2009, 14h08
  3. Récupérer la valeur renvoyé par une requette SQL
    Par laguine666 dans le forum Bibliothèques tierces
    Réponses: 2
    Dernier message: 24/04/2009, 22h40
  4. Réponses: 6
    Dernier message: 08/10/2008, 11h14
  5. [SQL]ajout d'une valeur au début d'un champs
    Par lifemaker2025 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 03/04/2007, 14h07

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