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 :

sqlite3, l'apostrophe ne passe pas


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    retraité, actif ??
    Inscrit en
    Mars 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : retraité, actif ??
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2008
    Messages : 23
    Par défaut sqlite3, l'apostrophe ne passe pas

    bonjour,

    voici le code qui me pose problème lors de l'insertion:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    try:
            curs.execute ("insert into larticle (titre, auteur, texte) values ('%s', '%s','%s')" %(strtitre, strauteur, strtexte))
            curs.commit()
    except SQLite.Error, error:
            print error
    strtexte contient du texte et lors de son insertion, lorsqu'une apostrophe est rencontrée:
    exemple: "... l'autre jour ..." ,il y a une erreur de syntaxe qui est notifiée:
    near "autre" : syntax error

    Je supprime l'apostrophe, l'erreur reviens à la suivante rencontrée.

    Que faire ??
    Merci de vos suggestions à venir

    Pancrace

    (-Ubuntu 8.10, Python 2.5 et sqlite3 et Geany)


  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Si j'essaye d'utiliser ta ligne de code, voilà ce que ça donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    strtitre = "toto"
    strauteur = "titi"
    strtexte = "l'autre jour"
    print "insert into larticle (titre, auteur, texte) values ('%s', '%s','%s')" %(strtitre, strauteur, strtexte)
    Ce qui affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into larticle (titre, auteur, texte) values ('toto', 'titi','l'autre jour')
    Manifestement, les apostrophes successives posent problème.

    Suggestion:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    t = """insert into larticle (titre, auteur, texte) values ("%s", "%s","%s")""" %(strtitre, strauteur, strtexte)
    Ce qui affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    insert into larticle (titre, auteur, texte) values ("toto", "titi","l'autre jour")
    Ce qui devrait marcher.

    Tyrtamos

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 688
    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 688
    Par défaut
    Salut

    utilisez ? à la place de %s
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    curs.execute (
       "insert into larticle (titre, auteur, texte) values (?, ?, ?)", 
        (strtitre, strauteur, strtexte))

    Et profitez pour relire la documentation qui vous explique pourquoi %s est "insecure"

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

  4. #4
    Membre averti
    Homme Profil pro
    retraité, actif ??
    Inscrit en
    Mars 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : retraité, actif ??
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2008
    Messages : 23
    Par défaut sqlite, l'apostrophe ne passepas

    bonjour,
    Merci tyrtamos et wiztricks pour les deux réponses à ma question.
    Je vais répondre aux deux suggestions:
    1ère) lorsque je code values (?,?,?), j'obtiens: Type Error: not all arguments converted during string formatting.
    ce n'est pas le bon choix.
    2ème) la requête SQL entre triples doubles-cotes et doubles cotes pour %s, alors ce sont les " du texte à insérer qui remplacent l'apostrophe pour déclencher l'erreur et interrompre le transfert.

    Une précision supplémentaire:
    La saisie des données se fait par une interface en wxPython, les données sont passées par un dictionnaire vers le code contenu dans utils.py; j'ai conservé strtitre, ... pour tester si le problème venais du dictionnaire.
    Non, et aucune raison..

    Je laisse la question pendante..
    A suivre....
    Pancrace



  5. #5
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    La solution de wiztricks marche, mais pas à l'extérieur de execute.

    Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cur.execute(" INSERT INTO table VALUES(?, ?)", ("mach'in", 'bid"ule'))
    Ce code ajoute bien un enregistrement comportant 2 valeurs, l'une avec une apostrophe et l'autre avec un guillemet.

    Pour passer le guillemet, on peut le mettre aussi avec un backslash: "bid\"ule"

    Cette solution est effectivement préférée à la solution "%s" par le manuel, l'autre posant des pb de sécurité (injection?).

    En général, l'avantage d'utiliser les triples guillemets est que cela permet de présenter les instructions SQL en plusieurs lignes, comme on pourrait le faire en console.

    Tyrtamos

  6. #6
    Membre averti
    Homme Profil pro
    retraité, actif ??
    Inscrit en
    Mars 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : retraité, actif ??
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2008
    Messages : 23
    Par défaut sqlie3, les apostrophes ne passent pas

    bonjour,
    Je pense avoir trouvé la solution au problème de l'apostrophe.
    Il faut placer la partie de la requête SQL entre triples simples cotes.
    ci-dessous le code en mode console Python:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import sqlite3
    con = sqlite3.connect(":memory:")
    cur = con.cursor()
    cur execute(" create table gens (fname, lname)")
    nom = "L'un"
    prenom = "L'autre"
    cur.execute('''insert into gens(fname, lname) values (?,?)''', (nom, prenom))
    J'ai repris cela dans le script qui n'acceptait pas les apostrophes.C'est bon.

    Je note Résolu

    Pancrace

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

Discussions similaires

  1. [RegEx] mon motif de regex ne passe pas
    Par hansaplast dans le forum Langage
    Réponses: 31
    Dernier message: 19/10/2005, 11h20
  2. ADO et access, ça passe pas.
    Par maximdus dans le forum Bases de données
    Réponses: 4
    Dernier message: 19/09/2005, 22h38
  3. Requête qui ne passe pas
    Par TheBart dans le forum Langage SQL
    Réponses: 2
    Dernier message: 10/08/2005, 10h12
  4. Envoi de mail [Hotmail : OK ; Wanadoo : Passe pas]
    Par NeoMan dans le forum Réseau
    Réponses: 14
    Dernier message: 28/07/2005, 10h52
  5. Sujet du mailto quine passe pas...
    Par Gourouni dans le forum ASP
    Réponses: 6
    Dernier message: 21/01/2005, 15h57

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