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 :

[SQLITE] passer une variable pour ma table


Sujet :

Python

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 11
    Points : 7
    Points
    7
    Par défaut [SQLITE] passer une variable pour ma table
    Bonjour, je suis nouveau dans le monde de python, et j'essaie désespérément de faire passer une variable pour le nom de ma table, dans ma requête SQL...

    J'ai essayé diverses choses au niveau syntaxe, en partant de ces deux modèles :
    table = "table1"
    cursor.execute('''SELECT nom FROM (?)''', table)
    cursor.execute('''SELECT nom FROM %s''', % table)

    J'ai toujours une erreur de syntaxe.
    sqlite3.OperationalError: near "%": syntax error

    J'ai besoin de faire ça car je vais passer une fonction avec comme argument le nom de la table qui m'intéresse.

    Si quelqu'un à une idée ... je suis à court.

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Il y a une virgule en trop dans le 2e cas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cursor.execute('''SELECT nom FROM %s''' % table)
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Effectivement, merci, ça fonctionne, comme quoi quand on bloque sur un truc on voit plus rien :p

    Par contre, si ma chaîne de caractère comprend un ' (simple quote), j'ai une erreur, comment échapper les quotes dans une variable comme ça ?

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Il faut voir si cette erreur est une erreur Python ou sqlite.

    Si c'est une erreur Python, on peut utiliser des triples guillemets (c'est ce que j'utilise):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cursor.execute("""SELECT nom FROM %s""" % table)
    Les triples guillemets (ou triples quotes) ont l'avantage de permettre la présentation dans le code source des requêtes sql complexes en plusieurs lignes.

    Mais l'autre forme marchait quand même, à condition que la dernière quote ne soit pas accolée aux 3 quotes.

    A noter que la documentation recommande, pour des raisons de sécurité (éviter les injections), d'utiliser plutôt la forme avec les '?':

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cursor.execute("""SELECT nom FROM ? """, (table,))
    Mais avec une application "fermée" et sqlite, la 1ère forme est probablement acceptable.

    Si c'est une erreur sqlite: donne l'erreur et un exemple de données.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Merci à vous deux pour vos réponses, effectivement j'avais vu que pour éviter les injections, il fallait plutôt utiliser ?, c'est donc ce que j'ai fait, et je n'avais pas bien compris je pense, mais en mettant ma variable comme une liste :

    '''SELECT nom FROM table WHERE condition=?''', [variable])

    Cela fonctionne très bien (l'exemple que je donne n'est pas pour la table, mais au final, mon problème portait surtout sur la syntaxe), donc c'est résolu, merci

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 07/06/2012, 16h07
  2. Erreur pour passer une variable entre formulaire
    Par georgesasc dans le forum IHM
    Réponses: 0
    Dernier message: 07/09/2010, 15h06
  3. Passer une variable pour un état
    Par chouchouilloux dans le forum IHM
    Réponses: 4
    Dernier message: 15/01/2010, 21h56
  4. Fonctions setappdata et getappdata pour passer une variable dans 2 gui
    Par mihaispr dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 02/05/2009, 14h55
  5. Problême pour passer une variable dans un SelectCommand
    Par Thetonio007 dans le forum ASP.NET
    Réponses: 12
    Dernier message: 26/06/2007, 14h37

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