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 :

caractere '\' intempestif [Python 2.X]


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 28
    Points : 16
    Points
    16
    Par défaut caractere '\' intempestif
    Bonjour,

    J'ai besoin de votre aide pour un problème que je n'arrive pas a régler malgré pléthores de tests.

    J'ai écrit un petit code qui me permet de valoriser une BDD de diverses tables.Pour m'aider dans la saisie des tables j'ai saisi divers tuple qui pourraient s'apparenter à une description du dictionnaire des données, une sorte de squelette de la BDD.J'y ai ajouté un tuple maintenance qui me permet de nombreux tests de validation ou d'enregistrement de données récupérées ci et la pour valider les requêtes dont j ai besoin tout au long du programme. Je vous passe les divers tests d'erreur que j'opère ci et la pendant l'accès a la base.

    Cependant au moment clé de la création de la requête qui va me servir a valoriser ma BDD, j'ai le caractère '\' qui s'insère dans les valeurs que j'appelle petit a petit et qui me permette de construire ma requête. En fait je crée 1 string avec une boucle qui récupère les valeurs utiles, construisant "une phrase" qui est qualibrée pour un INSERT ou UPDATE. Une fois constituée, je l’agrège à une variable requête et j'y rajoute 1 champs condition pour éviter les erreurs.

    C'est A ce moment que j'ai un truc du style phrase='\données1', '\donnée2', '\donnée3'...."

    Après des recherches net j'ai trouvé ça : s.replace("\"","") mais ça ne fonctionne que dans l'interpréteur. De plus ces caractères n'apparaissent que lorsque j'accole a ma requête 1 champ de condition SQL de type "WHERE ....". J'ai testé avec encode ou decode et d'autres tour de magie mais sans succès.En fait impossible de m'en débarrasser.

    Je suis totalement bloqué à cause de cette saloperie de caractère qui s'insère entre les valeurs récupérées et qui me fait penser au code de la touche entrée sur laquelle j'appuie quand je saisie les champs à la base.Etant noob(5 mois d'apprentissage python) je ne sais plus quoi faire.Pour le reste le code est total OK.

    Merci pour votre secours
    Cordialement

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Après des recherches net j'ai trouvé ça : s.replace("\"","") mais ça ne fonctionne que dans l'interpréteur.
    Sans doute que tu l'utilises mal.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    >>> s = "jfhurt"
    >>> s.replace('f', ' ')
    'j hurt'
    >>> s
    'jfhurt'
    >>> s = s.replace('f', ' ')
    >>> s
    'j hurt'
    En fait je crée 1 string avec une boucle qui récupère les valeurs utiles, construisant "une phrase" qui ....
    On peut voir ce code là ? Dans le vide, on ne peut rien dire.

  3. #3
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Salut,



    Sans doute que tu l'utilises mal.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    >>> s = "jfhurt"
    >>> s.replace('f', ' ')
    'j hurt'
    >>> s
    'jfhurt'
    >>> s = s.replace('f', ' ')
    >>> s
    'j hurt'
    On peut voir ce code là ? Dans le vide, on ne peut rien dire.
    Oui, mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> s= "jfhurt"
    >>> s.replace('f','')
    'jhurt'
    Pas d'aide par mp.

  4. #4
    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
    Salut,

    Citation Envoyé par estrasse Voir le message
    Cependant au moment clé de la création de la requête qui va me servir a valoriser ma BDD, j'ai le caractère '\' qui s'insère dans les valeurs que j'appelle petit a petit et qui me permette de construire ma requête. En fait je crée 1 string avec une boucle qui récupère les valeurs utiles, construisant "une phrase" qui est qualibrée pour un INSERT ou UPDATE. Une fois constituée, je l’agrège à une variable requête et j'y rajoute 1 champs condition pour éviter les erreurs.
    Plutôt que de "nettoyer" les caractères intempestifs, çà serait "mieux" d'essayer de comprendre pourquoi ils arrivent et de corriger cette génération qui ne devrait pas être si "spontanée". D'autant que si ce caractère là n'a rien à faire ici, le bug qui les produit pourrait en fabriquer d'autres.
    Bien sûr ne pas se poser ce genre de question et "nettoyer" est aussi une solution.

    - W
    PS: et c'est comme çà que nous avons rendu notre planète presque inhabitable.
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Déjà merci pour vos réponse rapides.

    Pour expliciter mieux le déroulement:
    D'abord j'envoie 1 requête qui soit récupère les clés primaires (PK) susceptibles d'exister soit 1 retour vide pour 1 ligne inexistante.Ensuite je teste si il y a 1 ou des doublons vu que je ne peux pas baser ma recherche sur des PK uniques.Enfin si il n'y a pas d'erreur manifeste j'envoie pour une requête INSERT/UPDATE avec un tuple maintenance qui conserve les PK, la requête utile,certaines vérif et des tuples qui ont les descriptions des tables a valoriser.

    Pour créer ces requêtes, soit pour INSERT/UPDATE j'utilise le tuple qui a les données saisies ou récupérées par calcul.C'est une boucle qui crée un agrégat entre données/valeurs et qui monte 1 phrase type string.A la fin j'ajoute un string de condition qui doit éviter les doublons d'enregistrement.C'est à ce moment seulement que dans le string qui formate les valeurs à garder, exemple "VALUES (donnée1,donnée2...)", s'insère le caractère "\" devant et à la fin de la valeur conservée du style '\donnée1\'. Dès lors la requête ne fonctionne pas à cause de ces caractères.Cela n'apparaît pas quand je n'ajoute pas un string de condition.J'ai même essayé de créer une phrase unique regroupant tout et ça fait pareil.

    Je dois ajouter que ces données sont issues d'un mode "saisie" ou "modification" qui consiste a saisir les champs par raw_string selon le mode.Donc dès que j'ai validé je tape sur entrée, ce qui me fait penser que ces "\" correspondent au code touche "entrée".Mais je ne sais comment les évacuer de la requête finale.
    Ca n'a pas de sens du fait que c'est un agrégat de string(phrase de base+ condition) et quand je ne mets pas cette condition ça ne fait pas ce rajout.

    Voila je ne vois pas quoi rajouter.

    merci encore

  6. #6
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Citation Envoyé par marco056 Voir le message
    Oui, mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> s= "jfhurt"
    >>> s.replace('f','')
    'jhurt'
    Mon propos n'est pas que l'on remplace x par y ou espace or rien mais que la méthode replace() ne transforme pas "sur place" la chaîne de texte mais retourne une autre chaîne transformée.

  7. #7
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Citation Envoyé par estrasse Voir le message
    Déjà merci pour vos réponse rapides.

    Pour expliciter mieux le déroulement:
    D'abord j'envoie 1 requête qui soit récupère les clés primaires (PK) susceptibles d'exister soit 1 retour vide pour 1 ligne inexistante.Ensuite je teste si il y a 1 ou des doublons vu que je ne peux pas baser ma recherche sur des PK uniques.Enfin si il n'y a pas d'erreur manifeste j'envoie pour une requête INSERT/UPDATE avec un tuple maintenance qui conserve les PK, la requête utile,certaines vérif et des tuples qui ont les descriptions des tables a valoriser.

    Pour créer ces requêtes, soit pour INSERT/UPDATE j'utilise le tuple qui a les données saisies ou récupérées par calcul.C'est une boucle qui crée un agrégat entre données/valeurs et qui monte 1 phrase type string.A la fin j'ajoute un string de condition qui doit éviter les doublons d'enregistrement.C'est à ce moment seulement que dans le string qui formate les valeurs à garder, exemple "VALUES (donnée1,donnée2...)", s'insère le caractère "\" devant et à la fin de la valeur conservée du style '\donnée1\'. Dès lors la requête ne fonctionne pas à cause de ces caractères.Cela n'apparaît pas quand je n'ajoute pas un string de condition.J'ai même essayé de créer une phrase unique regroupant tout et ça fait pareil.

    Je dois ajouter que ces données sont issues d'un mode "saisie" ou "modification" qui consiste a saisir les champs par raw_string selon le mode.Donc dès que j'ai validé je tape sur entrée, ce qui me fait penser que ces "\" correspondent au code touche "entrée".Mais je ne sais comment les évacuer de la requête finale.
    Ca n'a pas de sens du fait que c'est un agrégat de string(phrase de base+ condition) et quand je ne mets pas cette condition ça ne fait pas ce rajout.
    Désolé, mais ce charabia est inutile

    Voila je ne vois pas quoi rajouter.
    ben, le code par exemple.

  8. #8
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Mon propos n'est pas que l'on remplace x par y ou espace or rien mais que la méthode replace() ne transforme pas "sur place" la chaîne de texte mais retourne une autre chaîne transformée.

    J'avais mal compris, désolé.
    Pas d'aide par mp.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Bonjour,

    Comme vous êtes impatient de lire mon code,je vais vous fournir les parties utiles qui posent problème.Pas le tout y'en a pour des kilomètres:

    Déjà 1 exemple de mon dictionnaire des données regroupé sous une liste:
    if typerelation=="1":
    maintenance=[schoixmenu,"etrepresent","1","",choixmenu,"","","True","","individus","structures","nom_individu","nom_structure"]
    cles=('num_individu','num_structure','organigramme','date_entree','date_sortie')
    libelles=('Le nom de la personne','le nom de la structure','Sa place dans l organigramme','date integration','depart')
    Ici vous voyez 1 table relation a enregistrer.Il y a le tuple maintenance pour mes calculs et conservation de résultats a la volée et les 2 autres tuples sont les champs de la table avec les clés.

    Je vous passe les calculs sur la recherche de doublons,de PK etc qui fonctionne très bien sans erreur.J'ai réglé le problème du caractère intempestif pour la requête UPDATE.J'avais oublié des quotes dans l'expression ??.format().Du coup ça fonctionne.

    Le problème est maintenant sur une requête INSERT.Pour expliciter ma démarche,INSERT est utile lors de la saisie de données en direct par l'utilisateur.Les 3 listes sus-citées je les intègre dans une variable lstmenu que j'envoie à chaque fois en paramètre de fonction et qui sera transformé au grès des calculs.La saisie des données je la conserve dans 1 tuple que je mets en fin de position lstmenu.Pour INSERT tout est simple,s'il n'ya pas de doublon,d'erreur particulière ça donne ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1234
     
    reqsaisir="INSERT INTO {} VALUES{}"
     if lstmenu[0][4]=="S":#Mode saisir
                requete=reqsaisir.format(lien,lstmenu[3])#lien est la table à valoriser
    Et la bingo ça me donne un truc du style :
    insert into personne values('\donnee1', '\donnee2', ....)
    Ce caractère '\' s'insère en début de donnée uniquement dans la zone values().Quand je le replace() ça me fait péter 1 quote en fin de ce champ values et donc invalide la syntaxe SQL.

    Voila tout le reste fonctionne.Il me reste cette saleté a valider pour passer à l'étape Tkinter.

    Merci pour votre aide.
    Cordialement

  10. #10
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Juste une idée.

    Citation Envoyé par estrasse Voir le message
    ça me donne un truc du style :
    insert into personne values('\donnee1', '\donnee2', ....)
    Je me limite au traitement de chaines, et je cherche s'il n'y aurait pas un problème d'encodage. Voilà ce que je trouve (Python 2.7):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    reqsaisir="INSERT INTO {} VALUES {}"
     
    print reqsaisir.format("toto", "tata")
    INSERT INTO toto VALUES tata
     
    print reqsaisir.format("toto", "épais")
    INSERT INTO toto VALUES \xe9pais
    On voit que si le 1er caractère est un caractère accentué, il est donné avec un antislash.

    Est-ce un problème comme ça?

    Si oui, c'est facile à soigner: ce n'est qu'un problème d'affichage, et il suffit d'encoder la chaine à afficher en fonction de ce qu'attend la console d'affichage.

    Pour s'en assurer, on peut afficher la longueur de la chaine (avec len(...)): dans l'exemple, on trouve 29 et non 31, ce qui veut dire qu'en interne, '\xe9' est bien stocké comme un seul octet.
    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

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    bonjour,

    Merci pour ton idée tyrtamos.Mais je me suis attaché a tout encoder avec .encode('Utf8') dès que c'est possible.De plus comme je suis en phase de codage je ne mets aucun accent ni syntaxe pouvant planter le programme.

    Ce week end j'ai pu encore constater que le caractère '\' s'inséré uniquement lorsque j'accole un string supplémentaire à mon string de départ, comme ainsi : requête = requête+requête_condition
    La requête de base est correcte, je n'ai pas ce caractère mais dès que je lui colle une requête conditionnelle(requête_condition), du style "WHERE xxx='xxx'..." la requête de base prend ce caractère pour chaque valeur récupérée au fil de l'analyse et utile pour constituer ma requête INSERT ou UPDATE.

    Voila, je n'ai pas plus avancé depuis et je ne comprends rien à cette génération de caractère inutile mais qui me plante totalement le traitement.

    ++

  12. #12
    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
    Salut,

    Citation Envoyé par estrasse Voir le message
    Ce week end j'ai pu encore constater que le caractère '\' s'inséré uniquement lorsque j'accole un string supplémentaire à mon string de départ, comme ainsi : requête = requête+requête_condition
    La requête de base est correcte, je n'ai pas ce caractère mais dès que je lui colle une requête conditionnelle(requête_condition), du style "WHERE xxx='xxx'..." la requête de base prend ce caractère pour chaque valeur récupérée au fil de l'analyse et utile pour constituer ma requête INSERT ou UPDATE
    En fait, la construction de votre chaîne de caractère utilisée comme requête est à revoir.
    Mais comme vous ne montrez pas comment vous codez çà, pas facile de vous aider.

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

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Bonjour,

    Désolé, effectivement je n'ai pas mis tout le code car c'est assez long.J'insère mon algo pour la requête Update.Pour l'heure je me contente de faire des appels a des fonctions au grès des calculs mais tout ceci devra se retrouver au sein d'une classe quand je serai sûr d'avoir un truc fonctionnel.

    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
     
    reqmodif="UPDATE {} SET {}"
    reqcondrelPK=" WHERE {}="'"{}"'" AND {}="'"{}"'""
    ...
    if lstmenu[0][4]=="M": # UPDATE
        phrase="" # init obligatoire
        index = int(lstmenu[0][2])+1#Position au dela d ou on prend en compte la modif
        indey=0 # compteur de progression de base debute a 0 et a ne pas franchir
        for valeur in lstmenu[3]: #liste toutes les valeurs du tuple modification
            if indey<len(lstmenu[3])-1: # on ne depasse pas sa taille
                phrasetrans="{}='{}',".format(lstmenu[1][index],valeur).encode('Utf8') # on met 1 virgule a la fin
            else:
                phrasetrans="{}='{}'".format(lstmenu[1][index],valeur).encode('Utf8') # pas de virgule il n y a qu1 champ
            phrase+=phrasetrans.encode('Utf8') # reconstitution de la requete 
            index+=1 
            indey+=1
            if lstmenu[0][0]!="E":
                condition = reqcond.format(lstmenu[1][0],crit1).encode('Utf8')
                requete = reqmodif.format(lien,phrase,lstmenu[1][0],crit1).encode('Utf8')
            else:
                condition = reqcondrelPK.format(lstmenu[1][0],crit1,lstmenu[1][1],crit2).encode('Utf8')
            requete = reqmodif.format(lien,phrase).encode('Utf8')
            requete+=condition.encode('Utf8')
    Avant d'arriver a cette fonction, j'en ai une pour récupérer une liste de ce style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if typerelation=="1":#Cas de table relationnelle impliquant 2 entités distinctes
    maintenance=[schoixmenu,"etrepresent","1","",choixmenu,"","","True","","individus","structures","nom_individu","nom_structure"]
    cles=('num_individu','num_structure','organigramme','date_entree','date_sortie')
    libelles=('Le nom de la personne','le nom de la structure','Sa place dans l organigramme','date integration','depart')
    Et cela est valable pour toutes mes tables.C'est une sorte de descriptif de dictionnaire des données + une liste maintenance qui me permet d'insérer des variables utiles et modifiables en cours de traitement.
    A partir du menu choisi(Saisir,Modifier,Rechercher...) et du sous-menu(Individu,Structures,etrepresent(Relation)...), j'envoie vers différentes fonctions pour traiter les erreurs de saisie, l'existence de doublon etc... Comme je l'ai spécifié plus haut ça fonctionne hors agégat de requête conditionnelle.
    Je sais que le code est ringard mais je suis noob.C'est en fait pour moi un exercice(gestion d'assoss) qui doit me permettre d'évoluer.

    Voilà, j'espère que ça vous aidera à me secourir ^^.
    Merci encore

  14. #14
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Il y a au moins quelque chose qui n'est pas normal: les encodages successifs sur phrasetrans (.encode("utf-8")).

    En Python 3, cela génèrerait une erreur dès la 1ère fois. En Python 2, cela passe uniquement avec de l'ASCII pur (sans aucun caractère accentué).

    La manipulation de chaines de caractères en mémoire encodés en utf-8 n'est vraiment pas une bonne idée. La méthode recommandée sous Python 2 est:
    - en entrée dans le programme, on convertit les chaines en unicode (decode(...)) le plus tôt possible
    - en sortie du programme, on encode les chaines le plus tard possible avec l'encodage choisi pour le périphérique destinataire (console, disque, SGBDR, ...)
    - en interne, on ne travaille qu'en unicode

    Pour le déverminage de ton code, je te suggère de mettre des print un peu partout pour voir, dans les étapes successives du traitement de chaine, à quel moment ce méchant '\' arrive. Et donne le résultat ici.
    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

  15. #15
    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
    Salut,

    Vous n'avez pas mentionné la base de données utilisée. Normalement, son interface devrait être conforme à un protocole appelé DBAPI. Dans le tas de fonctionnalités que cela couvre, il y a bien sûr la possibilité de faire des requêtes "paramétrées".
    Exemple piqué sur le "net":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    db.execute('update players set name=?, score=?, active=? where jerseyNum=?', ('Smith, Steve', 42, True, 99))
    En gros, c'est le pilote de la base de donnée qui fera la conversion de type pour vous et vous n'avez pas besoin de construire vous même la chaîne de caractère SQL en vous prenant le chou à ajouter ou pas des "quotes" suivant le cas. Et comme le précisait Tyrtamos, si vous vous contentez de travailler en Unicode vous avez encore moins de soucis (et de boulot pour debugger).

    Comme vous voulez aussi passer noms de tables et de colonnes de façon dynamique, je procède généralement en 2 temps.
    1. construction de la requête paramétrique à partir de (par exemple) "update %(table) set %(columns) where jerseyNum=?" ou on remplace table par "players" et columns par "name=?, score=?, active=?". Ici on ne manipule que des chaines de caractères et on peut se cantonner à de l'ASCII simple.
    2. puis execution de la requête en lui passant un tuple d'objet Python dans le type correspondant. Pour le coup, on laisse le pilote faire le boulot de conversion.


    Dans votre cas, vous essayez de ré-inventer la roue...

    note: un des défauts de la DBAPI est qu'il existe plusieurs formules magiques pour paramétrer ses requêtes "?" en est un mais le pilote de votre base de donnée à peut être choisi d'autres formats. Quand vous en aurez marre de vous prendre le chou avec les différents pilotes, vous pourrez regarder des ORM comme SQLAlchemy qui vous donne un format compatible pour tous la plupart des pilotes intéressants.

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

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    J'ai choisi sqlite3 pour la BDD car ça marche bien avec un minimum de travail pour la connecter.
    Sinon je vais reprendre a part la partie qui me pose problème et debugger à tout petit pas en jalonnant l’exécution.Je l'ai déjà fait et c'est ainsi que j'ai remarqué que le caractère '\' arrive seulement lorsque je rajoute un bout de string qui vaut pour condition. Je vais isoler les bouts d'algo, moins les imbriquer et on verra.

    Je pense intuitivement comme vous que c'est un problème d'encodage.Je vais me reconcentrer sur cela.

    vous essayez de ré-inventer la roue...
    Vous m'avez bien fait rire, wiztricks, car en effet c'est un peu comme cela que je m'imagine pour l'heure, je fais du bricolage en regardant ce que ça provoque. Mais a ma décharge je n'en suis qu'à 5mois d'apprentissage de python^^.Je ne suis malheureusement pas développeur de métier.

    Merci beaucoup pour vos réponses,ça m'ouvre un champ d'idées à explorer.Je vous tiendrai au courant de mon calvaire^^.
    Cordialement

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Bonjour a tous,

    Grâce a toutes vos idées et à quelques re-lectures théoriques, j'ai pu régler le problème.

    Déjà il y avait un problème de quote dans la requête : phrasetrans="{}='{}'" que j'ai réécrit ainsi :
    phrasetrans="{}="'"{}"'"". Cette idée m'avait été insufflé par 1 d'entre vous mais bizarrement ça n'avait pas marché sur la bécane que j'utilisais alors.

    Ensuite, c'est en lisant le chapitre "les expressions régulières" du livre "Apprenez à programmer en python" que j'ai vu que le caractère '\' symbolisait en fait l'absence de quote dans une expression. Enfin comme cela m'avait été suggéré, j'ai relu le chapitre sur le codage des string et j'ai épuré les "encode('Utf8')".

    Et désormais c'est fonctionnel.

    Merci pour toutes vos suggestions qui m'ont bien aidées.

    Cordialement

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 06/11/2007, 12h36
  2. éliminer un caractere d'un string
    Par no-vice dans le forum Langage
    Réponses: 5
    Dernier message: 09/08/2002, 14h55
  3. Réponses: 3
    Dernier message: 12/06/2002, 21h15
  4. Réponses: 2
    Dernier message: 29/05/2002, 20h43
  5. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01

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