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 :

[debutant] Python, erreur syntaxe dans requete MYSQL !


Sujet :

Python

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 12
    Points : 8
    Points
    8
    Par défaut [debutant] Python, erreur syntaxe dans requete MYSQL !
    Bonjour, je débute sur python et je n'arrive pas a me sortir d'un pétrin apres plus de 2H...
    Je cherche a creer une fonction qui détruirais la table en question, si je laisse le nom statique de la table sa marche parfaitement, si je la passe en variable c'est le drame !

    Le code suivant fonctionne a merveille, c'est le suivant qui me pose des problemes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import MySQLdb
    def delltable ():
        mysql = MySQLdb.connect('localhost', 'scan-serv', 'test', 'servers')
        cursor = mysql.cursor ()
        cursor.execute ("TRUNCATE TABLE `test`")
    delltable() est bien réalisé je n'ai aucune probleme maintenant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import MySQLdb
    def delltable (table):
        mysql = MySQLdb.connect('localhost', 'scan-serv', 'test', 'servers')
        cursor = mysql.cursor ()
        cursor.execute ("TRUNCATE TABLE %s", (table))
    delltable("test") ne fonctionne absolument pas !

    Traceback (most recent call last):
    File "<pyshell#91>", line 1, in <module>
    delltable ("test")
    File "F:\python\testmysql.py", line 5, in delltable
    cursor.execute ("TRUNCATE TABLE %s", (table))
    File "F:\python\lib\site-packages\MySQLdb\cursors.py", line 173, in execute
    self.errorhandler(self, exc, value)
    File "F:\python\lib\site-packages\MySQLdb\connections.py", line 35, in defaulterrorhandler
    raise errorclass(errorvalue)
    ProgrammingError: (1064, "Erreur de syntaxe pr\xe8s de ''test'' \xe0 la ligne 1")
    Merci de m'aider

  2. #2
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Salut

    Pour passer les arguments à un curseur, c'est "?" qu'il faut utiliser.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cursor.execute ("TRUNCATE TABLE ?", (table))
    Toutefois, je ne suis pas certain que l'on puisse insérer une variable à cet endroit.

    Reste la solution suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cursor.execute ("TRUNCATE TABLE %s" % table)
    Attention aux injections SQL dans un tel cas.

    Note : est-il réellement nécessaire de créer une connexion pour une simple troncation de table ? Vous pouvez aussi bien utiliser une connexion existante.
    Note 2 : le nom "delltable" est peut-être mal choisi ? Il me fait plus penser à un DROP TABLE.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Antoine_935 Voir le message
    Salut

    Pour passer les arguments à un curseur, c'est "?" qu'il faut utiliser.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cursor.execute ("TRUNCATE TABLE ?", (table))
    Toutefois, je ne suis pas certain que l'on puisse insérer une variable à cet endroit.
    Cette méthode ne marche pas, la suivante fonctione par contre, est ce que je peux avoir plus de détails? car pour une insertion en BD j'utilise bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    cursor.execute ("""
          INSERT INTO `test` (
    `1` ,
    `2` ,
    `3` ,
    `4` ,
    `5` 
    )
    VALUES (
    %s, %s, %s, %s, %s
    )
         """, (data1, date2, data3, data4, data5))
    et cela fonctionne parfaitement ! Donc il ya forcement quelques choses qui m'échape tu pourrais m'aider a comprendre ses détails? merci !



    Note : est-il réellement nécessaire de créer une connexion pour une simple troncation de table ? Vous pouvez aussi bien utiliser une connexion existante.
    Note 2 : le nom "delltable" est peut-être mal choisi ? Il me fait plus penser à un DROP TABLE.
    bien sur mais ne comprenant pas l'erreur j'ai isolé mon code dans un fichier pour tester. Pour les injections SQL, c'est un script pas vraiment accesible, lancer par un crontab. Mais je suis prenneur d'idée pour sécurisée tout de même car je vais surement m'attaquer a des scripts accesible via un page web.

  4. #4
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Citation Envoyé par tutule Voir le message
    Cette méthode ne marche pas, la suivante fonctione par contre, est ce que je peux avoir plus de détails?.
    En fait, les DBMS n'acceptent pas tout en paramètre.
    Le but de base d'une requête préparée « prepared statement » est d'optimiser la requête une et une seule fois. On peut ainsi l'exécuter plusieurs fois, sans infliger au DBMS de devoir la ré-interpréter.
    Cette optimisation se fait en fonction des index, c'est-à-dire les clefs primaires, uniques, étrangères, etc.
    Le DBMS doit donc savoir à quelle(s) table(s) il a affaire. Autrement dit, sans la table, autant ne rien préparer.

    Du coup, impossible de passer le nom de la table en argument. On en a besoin directement. De même, il est impossible de donner des colonnes en arguments.

    Éviter les injections, c'est simple. Il suffit de s'assurer que ce qui vient des utilisateurs soit passé en arguments à une requête préparée, donc avec des %s, ? et autres.
    Il est parfois nécessaire de construire la requête en fonction de ce que les utilisateurs entrent. Ça peut être le cas pour un moteur de recherche, par exemple. Dans ce cas, filtrer et refiltrer pour s'assurer que rien ne passe.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Tiens tiens... Les problemes continuent.

    Si le nom de la base est test1 cela fonctionne si je rajoute un tiret test-1 ou une autre base admin-query ou je ne sais quel autres exemples la méthode
    cursor.execute ("TRUNCATE TABLE %s" %table) ne fonctionne plus !

    Tiens donc ! Quelqu'un a t_il une idée?

    Merci !
    Et merci pour tes explications Antoine_935 .

  6. #6
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Avez-vous sélectionné la bonne base de données ?
    Si oui, essayez de spécifier le nom de la base dans votre requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TRUNCATE TABLE "test-1"."table"
    Si ça ne fonctionne toujours pas, pensez à remplacer le - par un _. C'est d'ailleurs plus conforme aux standards.
    En passant, MySQL est peut-être le seul DBMS à supporter les - dans les identifiant. Ni Oracle, ni Postgres, ni SQL Server ne le supportente. À éviter donc.
    La norme est la suivante :
    Les identifiants doivent commencer par une lettre, et ne peuvent contenir que des lettre, chiffres ou underscores. Leur longueur ne doit pas excéder 128 caractères.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    la base de donnée était bien selectionné, en passant en nom standart avec des _ celà fonctionne beaucoups mieux ! Mais j'avais jamais eu ces erreurs avec php, j'ai donc pris de mauvaises habitudes

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

Discussions similaires

  1. [MySQL] erreur dans requete mysql
    Par serna dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 14/06/2013, 11h36
  2. Erreur syntaxe dans une recherche multicritère
    Par cigale13 dans le forum Access
    Réponses: 2
    Dernier message: 12/06/2006, 09h58
  3. problème de variable dans requetes mysql
    Par Nelmo dans le forum MFC
    Réponses: 6
    Dernier message: 20/05/2006, 23h30
  4. syntaxe dans requete
    Par decour dans le forum Access
    Réponses: 2
    Dernier message: 30/09/2005, 16h55
  5. erreur syntaxe dans requete
    Par dom - ien moutiers dans le forum Requêtes
    Réponses: 5
    Dernier message: 19/04/2004, 11h54

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