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 :

Comment affecter une variable à un champs ?


Sujet :

Python

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 14
    Points : 4
    Points
    4
    Par défaut Comment affecter une variable à un champs ?
    Bonjour,
    Comment peut-on enregistrer les deux variables dans le fichier (ce sera un enregistrement complet) ?
    J'en suis au stade débutant....
    Voici un exemple de code :
    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
     
    import sqlite3
     
    con = sqlite3.connect( "prev2" )
    cur = con.cursor()
    try:
        cur.execute( "create table papeterie(chp_lib , chp_montant)" )
    except: pass
     
    cur.execute("insert into papeterie values ( 'crayon', 1 )" )
    cur.execute("insert into papeterie values ( 'papier', 2 )" )
     
    #a=raw_input("Libelle : ")
    #b=raw_input("Montant : ")
    #con.execute("insert into t values (a,b)") # comment enregistre le a et b ? 
     
    cur.execute( "select * from papeterie " )
    for ligne in cur.fetchall() :
        print ( ligne )
     
    con.close()
    Merci d'avance

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Points : 184
    Points
    184
    Par défaut
    Salut !

    Pas sûr d'avoir tout compris, mais je tente le coup !

    En fait, il s'agit des 3 lignes commentées qui te posent problème ?

    Si c'est le cas, je te suggère d'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    con.execute("insert into t values ({0},{1})".format(a, b))
    A tester, je n'ai jamais utilisé sqlite3.

    Sinon :
    Citation Envoyé par trombo Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    try:
        cur.execute( "create table papeterie(chp_lib , chp_montant)" )
    except: pass
    Argh ! Tu vas avoir des problèmes à insérer quelque chose dans ta table si elle n'est pas créée !
    Si tu utilises ce code pour éviter d'avoir une erreur alors que ta table est déjà créée, je te suggère fortement de trouver un autre moyen.

    Et le except tout seul, c'est le mal !

  3. #3
    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
    La syntaxe de tes insert est bonne, quoique peut recommandable. Tu préféreras nommer les champs explicitement, plutôt que d'espérer mettre les bonnes choses à la bonne place, par chance.

    Ton souci ici est surtout le create table, puisqu'il n'est pas correct.
    En effet, il faut spécifier les types des champs.
    Dans ton cas, j'imagine que ceci conviendra:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE papeterie (
        chp_lib VARCHAR(50),
        chp_montant DECIMAL(10, 2)
    )
    Cela dit, quelques commentaires s'imposent sur cette table:
    1. chp signifie j'imagine champ. Ce n'est pas vraiment nécessaire de les mettre, puisqu'il s'agit d'office de champs. Aussi, lib n'est pas très explicite (en tout cas je ne vois pas ce qu'il signifie)

    Enfin, il est quasiment impératif d'avoir une clef primaire sur une table. On pourrait la mettre ici sur lib, ça aurait du sens. Ce n'est toutefois pas la meilleure solution... Bref, simplifions pour ce cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE papeterie (
        lib VARCHAR(50) PRIMARY KEY,
        montant DECIMAL(10, 2)
    )
    Pour info, decimal(10, 2) signifie "Nombre décimal à 10 chiffres, dont deux après la virgule".

    Reforgeons également tes insert si tu le permets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO papeterie (lib, montant) VALUES ('Papier', 3.4)
    Ceci nous amène à ce code:
    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
    >>> conn = sqlite3.connect(":memory:")
    >>> cursor = conn.cursor()
     
    >>> cursor.execute("""CREATE TABLE papeterie (
    ...     lib     VARCHAR(255) PRIMARY KEY,
    ...     montant DECIMAL(10, 2)
    ... )""")
     
    # Cfr plus bas pour explication
    >>> cursor.execute("INSERT INTO papeterie (lib, montant) VALUES (?, ?)",
    ...                ("Crayon", 1))
     
    >>> cursor.execute("INSERT INTO papeterie (lib, montant) VALUES (?, ?)",
    ...                ("Papier", 2))
     
    >>> cursor.execute("SELECT * FROM papeterie")
     
    >>> for line in cursor:
    ...     print(line)
    ...
    (u'Crayon', 1)
    (u'Papier', 2)
    Revenons un instant sur les ? introduits dans mes inserts.
    Il est très important de séparer la requête elle-même de ses variables, pour trois raisons:
    - Ca permet d'éviter des bugs quand des apostrophes, guillemets et autres caractères spéciaux se baladent dans tes variables
    - Ca évite surtout le fameux danger de l'injection SQL. Cette faille est très dangereuse, et peut permettre de supprimer des bases de données entières.
    - Dans certains cas, ça permet d'optimiser le temps nécessaire pour les requêtes. Je ne pense pas que ce soit le cas ici.

    Je ne pourrais que te conseiller d'apprendre d'abord à te servir de SQL avant de te lancer dans la programmation d'une application qui s'en sert
    Tu as tout ce qu'il faut ici: http://sgbd.developpez.com/

    Bonne chance

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 14
    Points : 4
    Points
    4
    Par défaut de variable à champ
    Merci Antoine et Nardo

    Je reprends donc la proposition d'Antoine qui me parait en effet plus propre que mon premier essai.

    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
     
    import sqlite3
     
    conn = sqlite3.connect(":memory:")
    cursor = conn.cursor()
     
    cursor.execute("""CREATE TABLE papeterie (lib VARCHAR(255) PRIMARY KEY, montant DECIMAL(10, 2))""")
     
    # Cfr plus bas pour explication
    cursor.execute("INSERT INTO papeterie (lib, montant) VALUES (?, ?)",("Crayon", 1))
     
    cursor.execute("INSERT INTO papeterie (lib, montant) VALUES (?, ?)",("Papier", 2))
     
    cursor.execute("SELECT * FROM papeterie")
     
    for line in cursor:
         print(line)
    A partir de là, comment faut-il procéder pour entrer des données de manières interactives ? C'est à dire que le programme demande libellés et montants dans une fenêtre (par un input ? raw_input ? write ? autre ?) et stocke les données au fur et mesure dans le fichier.
    J'aimerais pouvoir manipuler un peu avant d'étudier le SQL, mes neurones sont trop figées pour passer directement à la théorie
    a+

  5. #5
    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 trombo Voir le message
    C'est à dire que le programme demande libellés et montants dans une fenêtre (par un input ? raw_input ? write ? autre ?)
    Dans une fenêtre ? Alors il te faudra étudier de la théorie :p Car tu auras besoin d'une librairie graphique telle Tk, Wx, Gtk... Si je devais en choisir une, ce serait Gtk ou Wx. Gtk a une API très confortable, Wx un aspect graphique natif.

    Sinon, solution simple: raw_input
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> lib = raw_input("Entrez le libellé: ")
    Entrez le libellé: Crayon
    >>> lib
    'Crayon'

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Je ne peux pas prétendre à des grosses ambitions, mais il faudrait que je fasse quelques petits programmes à usages personnels. Tkinter fera peut-être l'affaire...

    Sinon, solution simple: raw_input
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> lib = raw_input("Entrez le libellé: ")
    Entrez le libellé: Crayon
    >>> lib
    'Crayon'
    [/QUOTE]

    Oui mais comment définitivement stocker 'crayon' dans le fichier ?

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 14
    Points : 4
    Points
    4
    Par défaut sauvegarder une saisie
    Je suis peut-être complètement à côté de la plaque.... mais il doit bien y avoir moyen de faire une saisie clavier et d'en sauvegarder le résultat dans un fichier ???

    Citation Envoyé par Antoine_935 Voir le message
    Dans une fenêtre ? Alors il te faudra étudier de la théorie :p Car tu auras besoin d'une librairie graphique telle Tk, Wx, Gtk... Si je devais en choisir une, ce serait Gtk ou Wx. Gtk a une API très confortable, Wx un aspect graphique natif.

    Sinon, solution simple: raw_input
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> lib = raw_input("Entrez le libellé: ")
    Entrez le libellé: Crayon
    >>> lib
    'Crayon'

  8. #8
    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
    A la vue de ces deux bouts de codes, la manière de procéder me parait assez claire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cursor.execute("INSERT INTO papeterie (lib, montant) VALUES (?, ?)",
                  ("Papier", 2))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> lib = raw_input("Entrez le libellé: ")
    Entrez le libellé: Crayon
    >>> lib
    'Crayon'

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Ca y est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    lib = raw_input("Entrez le libellé: ")
    cursor.execute("INSERT INTO papeterie (lib, montant) VALUES (?, ?)",((lib), 2))
    Tout petit pas pour l'humanité. Grosse victoire pour moi.
    Merci Anthony.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 10/10/2011, 16h04
  2. Comment affecter une variable sous unix
    Par police44 dans le forum Forms
    Réponses: 2
    Dernier message: 16/03/2010, 10h08
  3. [Template] Comment affecter une variable dans un include dans une boucle
    Par Daxou31 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 05/10/2008, 15h03
  4. Réponses: 5
    Dernier message: 16/09/2008, 17h28
  5. Réponses: 3
    Dernier message: 18/07/2006, 10h17

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