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 :

SQL et Python je suis bloqué sur une betise je pense


Sujet :

Python

  1. #1
    Membre confirmé
    Homme Profil pro
    support technique
    Inscrit en
    Mars 2020
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : support technique

    Informations forums :
    Inscription : Mars 2020
    Messages : 79
    Par défaut SQL et Python je suis bloqué sur une betise je pense
    Bonjour,

    me voila encore bloqué
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def Update_Base(valeur1, valeur2, nom):
        Acces_Base()
        # SQL_Querry = ("UPDATE jeu SET Intelligence = %s WHERE Nom = %s")
        # SQL_Querry = ("UPDATE jeu SET 'Intelligence' = %s WHERE Nom = %s")
        SQL_Querry = ('UPDATE jeu SET %s = %s WHERE Nom = %s')
        SQL_Data = (valeur1, valeur2, nom)
        cursor.execute(SQL_Querry, SQL_Data)
        cnx.commit()
        cursor.close()
        cnx.close()
    je lance la fonction comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Update_Base('Intelligence', 10, 'Didier')
    mon erreur est là : raise get_exception(packet)
    mysql.connector.errors.ProgrammingError: 1064 (42000): Erreur de syntaxe près de ''Intelligence' = 10 WHERE Nom = 'Didier'' à la ligne 1

    et en fait mon soucis
    cette ligne fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL_Querry = ("UPDATE jeu SET Intelligence = %s WHERE Nom = %s")
    et celle là non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL_Querry = ("UPDATE jeu SET 'Intelligence' = %s WHERE Nom = %s")
    J'en conclue que quand j'adresse le champs Intelligence de ma table jeu, je met des apostrophes autour de Intelligence il n'accepte pas la requête

    Et comme j'aurai aimé laissé l'utilisateur choisir quel champs il veut modifier faut bien que je passe par une variable de type string qui se traduit par la mise en place des apostrophes.

    Auriez vous une idée de la bonne syntaxe ?

    Merci d'avance

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 683
    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 683
    Par défaut
    Citation Envoyé par figuedi Voir le message
    Auriez vous une idée de la bonne syntaxe ?
    Il y a 2 parties dans une requête SQL, la requête et les données.

    La requête n'est qu'une chaine de caractères, si vous voulez y utiliser des champs variables, comme Intelligence, il va falloir faire en 2 temps, le deuxième pour faire la requête avec "UPDATE jeu SET Intelligence = %s WHERE Nom = %s" et le premier pour placer Intelligence au bon endroit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> "UPDATE jeu SET %s = %%s WHERE Nom = %%s" % 'ZZ'
    'UPDATE jeu SET ZZ = %s WHERE Nom = %s'
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 507
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 507
    Par défaut
    on pourrait passer par une f-string aussi je pense
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SQL_Querry = (f'UPDATE jeu SET {valeur1} = %s WHERE Nom = %s')
    SQL_Data = (valeur2, nom)
    Et bon, changer le nom des variables aussi (surtout valeur1 pour indiquer plus clairement que c'est le nom d'un champ).
    Dans l'absolu, il faudrait aussi vérifier (si ce n'est déjà fait) que le champ existe avant de faire cette requête ou gérer les erreurs

  4. #4
    Membre confirmé
    Homme Profil pro
    support technique
    Inscrit en
    Mars 2020
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : support technique

    Informations forums :
    Inscription : Mars 2020
    Messages : 79
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def Update_Base(caract, valeur, nom):
        Acces_Base()
        SQL_Querry = (f'UPDATE jeu SET {caract} = %s WHERE Nom = %s')
        print(SQL_Querry)
        SQL_Data = (valeur, nom)
        cursor.execute(SQL_Querry, SQL_Data)
        cnx.commit()
        cursor.close()
        cnx.close()
        Lire_Base(nom)
    En effet cela fonctionne nickel comme ça.

    Merci beaucoup

  5. #5
    Membre confirmé
    Homme Profil pro
    support technique
    Inscrit en
    Mars 2020
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : support technique

    Informations forums :
    Inscription : Mars 2020
    Messages : 79
    Par défaut
    Mais la solution de Wiztricks est fonctionnelle également
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def Updata_Base(caract, valeur, nom):
        Acces_Base()
        SQL_Querry = ("UPDATE jeu SET %s = %%s WHERE Nom = %%s" % caract)
        print(SQL_Querry)
        SQL_Data = (valeur, nom)
        cursor.execute(SQL_Querry, SQL_Data)
        cnx.commit()
        cursor.close()
        cnx.close()
        Lire_Base(nom)

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 683
    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 683
    Par défaut
    Citation Envoyé par figuedi Voir le message
    Mais la solution de Wiztricks est fonctionnelle également
    La solution était de comprendre le coup de la construction de la requête à séparer de son exécution.

    Après, formater la chaine de caractères, il y a plein de façons de faire, plus ou moins à la mode... et ce n'est pas le formatage retenu qui va changer qui va apporter grand chose de plus.

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

  7. #7
    Membre confirmé
    Homme Profil pro
    support technique
    Inscrit en
    Mars 2020
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : support technique

    Informations forums :
    Inscription : Mars 2020
    Messages : 79
    Par défaut
    Salut,
    oui tu as raison mais je n'ai toujours ps compris le pourquoi. Je sais maintenant qu'il faut le faire mais cela reste obscur.

    Sur cette fonction si je ne rajoute pas les guillemets il refuse de l’exécuter "%s"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def Update_Base(caract, valeur, nom):
        Acces_Base()
        SQL_Querry = ("UPDATE jeu SET %s = %s WHERE Nom = '%s'" % (caract, valeur, nom))
        print(SQL_Querry)
        cursor.execute(SQL_Querry)
        cnx.commit()
        cursor.close()
        cnx.close()
        Lire_Base(nom)
    Ce que j'en conclue c'est qu'en faisant une substitution des variables sur la même ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL_Querry = ("UPDATE jeu SET %s = %s WHERE Nom = '%s'" % (caract, valeur, nom))
    il ne rajoute pas les guillemets sur les variables strings

    Si par contre tu lui passes les variables lors de l'exécution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SQL_Querry = (f'UPDATE jeu SET %s = %s WHERE Nom = %s')
    SQL_Data = (caract, valeur, nom)
    cursor.execute(SQL_Querry, SQL_Data)
    Il te les rajoute

    Ce n'est donc pas la séparation de la condition qui prime mais bien la façon que tu utilises pour lui passer les infos.

    Enfin c'est que je pense avoir compris en faisant des print de la SQL_Query.

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 683
    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 683
    Par défaut
    Citation Envoyé par figuedi Voir le message
    oui tu as raison mais je n'ai toujours ps compris le pourquoi. Je sais maintenant qu'il faut le faire mais cela reste obscur.
    Ce n'est pas obscur: si j'écris cursor.execute(query, values), c'est le pilote qui fera le "cast" entre le type des variables à la position qu'il trouve dans query (les %s).
    Si on écrit: "UPDATE jeu SET %s = %s WHERE Nom = '%s'" % (caract, valeur, nom)), on construit la requête "en dur". Ce qui n'est pas très judicieux car ce n'est pas une simple substitution!

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

  9. #9
    Membre confirmé
    Homme Profil pro
    support technique
    Inscrit en
    Mars 2020
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : support technique

    Informations forums :
    Inscription : Mars 2020
    Messages : 79
    Par défaut
    Merci c'est plus clair maintenant

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

Discussions similaires

  1. Je suis bloqué sur une requête left join
    Par Ibtissam jeb dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/06/2020, 18h51
  2. Réponses: 3
    Dernier message: 17/08/2019, 19h40
  3. [SQL-SERVER 2000] Problème de requête sur une seule ligne
    Par Sytchev3 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 05/04/2006, 16h54
  4. Bloqué sur une association
    Par benjhe dans le forum Schéma
    Réponses: 4
    Dernier message: 31/03/2006, 15h49
  5. [ACCESS] Je bloque sur une requête...
    Par portu dans le forum Langage SQL
    Réponses: 8
    Dernier message: 16/02/2006, 10h33

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