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 :

utilisation de l'instruction : string % (liste arguments)


Sujet :

Python

  1. #1
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut utilisation de l'instruction : string % (liste arguments)
    Bonjour,
    Je viens de tomber sur un cas qui me pose problème.
    Je traite une liste de requetes sql en tant que liste de string et je remplace les %s de ma requete par les valeurs attendues. J'airencontré le cas suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    req = "select count(*) from airport where airport_name='%s' and point_name = 'DUMM%' " % ('LFPG')
    et j'ai une erreur détectée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TypeError : not enough arguments for fomat string
    donc le '%' de la string 'DUMM%' est pris comme début de format ... ce n'est pas trop logique à mon sens et réduit considérablement l'utilisation de l'instruction "string % (arguments)".
    La seule solution de contournement que je vois est de remplacer moi même les %s par mes arguments ... a moins qu vous y voyez une autre possibilité ?
    Merci de votre aide

  2. #2
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    req = "select count(*) from airport where airport_name='%s' and point_name = 'DUMM%%' " % ('LFPG')
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> req
    "select count(*) from airport where airport_name='LFPG' and point_name = 'DUMM%' "
    @+
    Merci d'utiliser le forum pour les questions techniques.

  3. #3
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    merci, mais que cela signifie t'il ? qu'il faut doubler le % pour qu'il n'interfère pas ?
    Le souci dans mon cas est que le 'DUMM%' m'est fourni tel que (le % a un sens dans Oracle) et je ne dois pas en changer le sens, seules les valeurs à instancier (repéré par %s) sont censés être modifiables.
    J'ai choisi la solution de contournement un peu bourrin qui consiste à remplacer les %s par les bonnes valeurs en utilisant string.replace().

  4. #4
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Oui, le double % s’échappe lui-même (comme avec le \, d’ailleurs…).

    De toute façon, il me semble qu’il n’est pas conseillé d’utiliser ce genre de pratiques en SQL, ça peut très vite devenir des autoroutes à injection… Pourquoi ne pas utiliser le mécanisme SQL prévu dans ce cas-là (le ? si je me rappelle bien…)*? Là, c’est le moteur SQL qui se charge de la substitution, et donc interdit toute tentative d’injection…

  5. #5
    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 awalter1 Voir le message
    J'ai choisi la solution de contournement un peu bourrin qui consiste à remplacer les %s par les bonnes valeurs en utilisant string.replace().
    C'est effectivement un peu "bourrin".

    Car avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    t = "select count(*) from airport where airport_name='%s' and point_name = 'DUMM%'"
    req = t % ('LFPG')
    essaie de remplacer dès que '%' est rencontré.

    Normalement la DBAPI (implémentée par le driver Oracle utilisée) définit une méthode pour éviter les "collisions" entre des chaînes paramétrables au sens Python et le celles de la query.

    C'est de la forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    qry = """select count(*) from airport 
               where airport_name = :airport_name and 
               point_name = :point_name"""
    .execute(qry, airport_name='LFPG', point_name='DUMM%')
    Notez que dans "airport_name=:airport_name" on ne force plus l'argument à être "string" => on laisse le driver convertir le type "Python" dans le type "Oracle" qui va bien.

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

  6. #6
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Je viens de m'apercevoir que la syntaxe n'est pas <!='DUMM%'>
    mais <not like 'DUMM%'>

    Merci à wiztricks, je ne connaissais pas le mécanisme de substitution proposé par le driver d'interface (dans mon cas cx_Oracle), j'ai testé, ça marche

  7. #7
    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 awalter1 Voir le message
    Je viens de m'apercevoir que la syntaxe n'est pas <!='DUMM%'> mais <not like 'DUMM%'>
    Ce n'est pas, ici, un problème de "syntaxe" mais d'une requête différente.

    je ne connaissais pas le mécanisme de substitution proposé par le driver d'interface (dans mon cas cx_Oracle), j'ai testé, ça marche
    Vous pouvez aussi y "mélanger" un autre mécanisme de substitution.
    En écrivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def selectXYZ(c, airport_name, point_name='DUMM%'):
        qry = """select count(*) from airport 
               where airport_name = :airport_name and 
               point_name = :point_name"""
        rows = c.execute(qry, vars())
        return...
    Le nom des paramètres de la fonction sert à renseigner le "dict" vars() - un alias de locals() - et éventuellement y mettre des valeurs par défaut.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

Discussions similaires

  1. Utilisation de variable dans une liste d'arguments
    Par bk313142 dans le forum Général JavaScript
    Réponses: 16
    Dernier message: 27/12/2009, 18h51
  2. utilisation de std::find( string )
    Par ccensam dans le forum SL & STL
    Réponses: 1
    Dernier message: 24/11/2006, 22h07
  3. Tableau de string en argument
    Par Tymk dans le forum C++
    Réponses: 4
    Dernier message: 10/09/2006, 15h32
  4. coversion string<-->list
    Par john491 dans le forum Général Python
    Réponses: 16
    Dernier message: 10/05/2006, 10h27
  5. Réponses: 5
    Dernier message: 06/09/2005, 02h50

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