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 :

Questions débutant sqlite3/python2.5


Sujet :

Python

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 14
    Points : 11
    Points
    11
    Par défaut Questions débutant sqlite3/python2.5
    Bonjour à tous,
    j'ai une fenêtre de saisies avec Tkinter ( nom, prénom, date etc...)
    Je veux enregistrer cette "Base" avec Sqlite3. Mes saisies sont en mémoire (Nom, Prénom,Date, etc...)
    J'ai trouvé des infos :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import sqlite3
    import os
    database_name = "essaidb.db"
    if not os.path.isfile(database_name):
        print "database est crée "
    db_connection = sqlite3.connect(database_name)
    cur = db_connection.cursor()
    #cur.execute("CREATE TABLE IF NOT EXISTS clients (id INT, text TEXT)")  # Création d'une table
    cur.execute("CREATE TABLE IF NOT EXISTS clients ( id integer, NOM varchar, AGE integer)")  # Création d'une table
    cur.execute ("insert into clients(id, NOM, AGE) values (0, 'Mac', 50)")
    cur.execute ("insert into clients(id, NOM, AGE) values (1, 'Mic', 51)")
    db_connection.commit()
    db_connection.close()
    Ca fonctionne, mais c'est moi qui entre les valeurs, je n'arrive pas à touver la syntaxe pour enregistrer mes variables.Ni la liste des fonctions qui permettent la gestion de cette base( insertion, recherche, etc).
    Et apparemment le format date n'est pas pris en charge, il faut le transformer en string?

    Je sais pas si je suis clair?

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    bonsoir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for data in [(0, 'Mac', 50), (1, 'Mic', 51)]:
        c.execute('insert into clients(id, NOM, AGE) values (?,?,?)', data)
    les fonctions de recherche, insertion, etc il n'y en a pas. je crois que tout passe par des execute avec des requêtes sql.

    en ce qui concerne les dates:

    http://docs.python.org/library/sqlit...apter-callable

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 14
    Points : 11
    Points
    11
    Par défaut Merci Kango
    Merci de ton aide, j'ai économisé beaucoup de temps. Ca fonctionne.
    Toutefois je ne comprends pas l'utilité de la boucle? (sans, ça fonctionne pas)
    Autre question pour finr peut etre...

    Maintenant dans une fenetre, je saisie "ID" (qui est un code barre, mais peut importe) et je veux avoir acces à la bdd, pour changer des champs, et bien sur les enregistrer.Avec Tkinter toujours.
    Avec execute? je suppose mais je n'arrive pas à touver les possibilité de execute? Et en plus il fait chaud!

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    bonjour,

    non, la boucle n'est pas indispensable:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c.execute('insert into clients(id, NOM, AGE) values (?,?,?)', (0, 'Mac', 50))
    pour rechercher on utilise un execute avec une instruction select, et c'est une instruction update pour mettre à jour:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    c.execute("SELECT id, NOM, AGE FROM clients WHERE id = ?", id)
    res = c.fetchall()
     
    c.execute("UPDATE clients SET NOM = ?, AGE = ? WHERE id = ?", ('Mac', 50, 0))

  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
    Bonjour,

    Toutefois je ne comprends pas l'utilité de la boucle? (sans, ça fonctionne pas)
    La boucle remplace les deux lignesi nitiales:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cur.execute ("insert into clients(id, NOM, AGE) values (?,?,?)", (0, 'Mac', 50))
    cur.execute ("insert into clients(id, NOM, AGE) values (?,?,?)", (1, 'Mic', 51))
    Mais on aurait pu écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    li = [(0, 'Mac', 50), (1, 'Mic', 51)]
    cur.executemany("insert into clients(id, NOM, AGE) values (?,?,?)", li)
    Maintenant dans une fenetre, je saisie "ID" (qui est un code barre, mais peut importe) et je veux avoir acces à la bdd, pour changer des champs, et bien sur les enregistrer.Avec Tkinter toujours.
    execute permet d'exécuter n'importe quelle requête SQL mais il faut investir un peu dans SQL pour 'être à l'aise' dans le codage des requêtes SQL qu'on lui passe.

    Si vous n'êtes pas à l'aise avec SQL, je vous recommande de jeter un oeil à Elixir. Ca va habiller vos requêtes SQL de sorte que vous pourrez oublier la requête, le type de base de données, et disposer d'une API plus proche de Python pour effectuer recherches, créations et mises à jour.

    Pour débuter et traiter ce que vous avez présenté, les informations qui sont dans le tuto sont largement suffisantes.

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

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 14
    Points : 11
    Points
    11
    Par défaut Je tourne en rond
    Bonjour à tous et merci de votre aide.
    Suivant les conseils, je me mets à SQL. Mon probleme actuel :
    J'ai une table Sqlite3 crée :
    cur.execute("CREATE TABLE IF NOT EXISTS CLIENTS(CB,DATE, NOM , PRENOM, ADRESSE,CP,VILLE,TEL,PORTABLE,MAIL,NAISSANCE,VISITE,MONTANT,DATE_DERNIERE_VISITE,CUMUL,POINTS,PRELEVEMENT,DATE_DERNIER_PRELEVEMENT,RESTE) ")
    J'ai une fentre de saisie : CB; si CB existe, je voudrais ouvrir une nouvelle fenetre avec tous les champs de la table.
    Je plante déjà là!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def verif() :
            CB = saisieCB.get()
            FichierFidelCard = "FIDELCARD.db"
            db_connexion = sqlite3.connect(FichierFidelCard)
            cur = db_connexion.cursor()
     
     
            cur.execute("SELECT  CB  from  clients WHERE CB = ?",CB)
            resultat = cur.fetchall()
            #cur.execute("UPDATE CLIENTS SET NOM= ?, PRENOM =?, WHERE CB = ?, (NOM, PRENOM,CB))
            print resultat
            db_connexion.close()
    Incorrect number of bindings supplied. The current statement uses 1, and there are 2 supplied.
    Je modifie tout et ça marche pas...

  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
    Salut
    Incorrect number of bindings supplied. The current statement uses 1, and there are 2 supplied.
    Vous ne dites pas quelle ligne mais que contient CB?
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 45
    Points : 36
    Points
    36
    Par défaut
    Salut,


    wiztricks a raison en te demandant ce que contient CB.
    CB doit être un tuple qui ne contient qu'un seul élément. Donc de la forme :
    (fait bien attention a mettre la virgule avant la parenthèse)

    actuellement, CB contient deux éléments, et le programme n'en a besoin que dun seul. C'est donc une erreur.
    Relis la première ligne de ta fonction car c'est probablement elle qui cloche.


    Bonne chance

    Lotendan

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 14
    Points : 11
    Points
    11
    Par défaut Merci à tous
    effectivement Lotendan avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CB = (saisieCB.get(),)
    Ca fonctionne! Je comprends pas encore bien pourquoi, mais je cherche...

  10. #10
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    La représentation d’un tuple est caractérisée par deux parenthèses et, S’IL Y A DES ÉLÉMENTS dans le tuple, AU MOINS UNE VIRGULE aprés un élément.

    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
    x = [ len(mot) for mot in 'mer soleil sable'.split() ]
    print "x = [ len(mot) for mot in 'mer soleil sable'.split() ]"
    print '==>       x  est',x,'    type(x) est',type(x)
    print 'ET  tuple(x) est',tuple(x),'    type(tuple(x)) est',type(tuple(x))
     
     
    y = [ len(mot) for mot in 'mer'.split() ]
    print "\n\ny = [ len(mot) for mot in 'mer'.split() ]"
    print '==>       y  est',y,'     type(y) est',type(y)
    print 'ET  tuple(y) est',tuple(y),'    type(tuple(y)) est',type(tuple(y))
     
     
    z = [ len(mot) for mot in ''.split() ]
    print "\n\nz = [ len(mot) for mot in ''.split() ]"
    print '==>       z  est',z,'    type(z) est',type(z)
    print 'ET  tuple(z) est',tuple(z),'    type(tuple(z)) est',type(tuple(z))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    x = [ len(mot) for mot in 'mer soleil sable'.split() ]
    ==>       x  est [3, 6, 5]     type(x) est <type 'list'>
    ET  tuple(x) est (3, 6, 5)     type(tuple(x)) est <type 'tuple'>
    
    
    y = [ len(mot) for mot in 'mer'.split() ]
    ==>       y  est [3]      type(y) est <type 'list'>
    ET  tuple(y) est (3,)     type(tuple(y)) est <type 'tuple'>
    
    
    z = [ len(mot) for mot in ''.split() ]
    ==>       z  est []     type(z) est <type 'list'>
    ET  tuple(z) est ()     type(tuple(z)) est <type 'tuple'>


    D’ailleurs, même dans la définition d’un tuple à plusieurs éléments, on peut faire suivre le dernier élément d’une virgule, ça ne perturbe en rien:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    w = (120,450,34,)
    print 'w = (120,450,34,)'
    print 'w est',w,'  type(w) est',type(w)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    w = (120,450,34,)
    w est (120, 450, 34)   type(w) est <type 'tuple'>


    Nota:

    J’ai défini les listes x,y,z au moyen de list comprehesions qui ne comportent aucune virgule pour qu’il soit bien clair que les virgules dans les représentations des tuples ne proviennent pas de l’écriture des listes.






    Deux parenthèses vides représentent un tuple vide.

    Dès qu’il y a un machin entre deux parenthèses, (machin) est considéré comme représentant le machin:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    a = tuple([])
    print 'a = tuple([])'
    print 'a est',a,'   type(a) est',type(a)
     
    b = (1000)
    print '\nb = (1000)'
    print 'b est',b,'   type(b) est',type(b)
     
    def f(x): return 2*x
    c = (f)
    print 'def f(x): return 2*x\nc = (f)'
    print '\nc est',c,'   type(c) est',type(c)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    a = tuple([])
    a est ()    type(a) est <type 'tuple'>
     
    b = (1000)
    b est 1000    type(b) est <type 'int'>
     
    def f(x): return 2*x
    c = (f)
    c est <function f at 0x010A1130>    type(c) est <type 'function'>

  11. #11
    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
    Ouch Eyquem

    Avec çà, il n'est même pas certain que saisieCB.get() ne retourne pas une liste ... ce qui lui irait très bien comme itérable.

    Je trouve ces histoires de tuples un peu compliquées...
    Ne s'agit-il pas de lever une ambiguïté d'écriture pour les tuples à 0 ou 1 élément?

    Un tuple n'a pas besoin de parenthèses pour être défini:
    u = 1, 2 est un tuple identique à: u = (1, 2)
    Par contre u = 1 définit u comme entier, alors que u = 1, le définira comme tuple à 1 élément.
    - W
    PS: on peut aussi écrire u = tuple([ 1 ]) ce qui est la forme "normale" mais u = 1, fait sans doute plus chébran
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Ave wiztricks,




    Avec çà, il n'est même pas certain que saisieCB.get() ne retourne pas une liste
    Peu importe. Il ne s’agit pas que saisieCB.get() soit un tuple plutôt qu’une liste, il s’agit que CB en soit un.

    CB = saisieCB.get(), ou CB = (saisieCB.get() ,) sont kifkif et l’assurent.











    Ne s'agit-il pas de lever une ambiguïté d'écriture pour les tuples à 0 ou 1 élément?
    Disons surtout pour 1 élément, car il n’y a qu’une manière de représenter un tuple vide: ()

    Je ne trouve pas que 13, ou (13,) soient une ambigüité d’écriture. C’est un élément de syntaxe à connaître, il faut une virgule, c’est tout.







    Tu as parfaitement raison: une virgule est plus déterminante que des parenthèses pour définir un tuple puisqu’on peut définir un tuple sans usage de parenthèses mais pas l’inverse.

    Mais ce que j’ai écrit n’est pas faux non plus:
    La représentation d’un tuple est caractérisée par deux parenthèses et, S’IL Y A DES ÉLÉMENTS dans le tuple, AU MOINS UNE VIRGULE aprés un élément.
    Le fait est que la représentation = affichage de la valeur d’un tuple comporte toujours des parenthèses:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    tutu = tuple([4,9])
    print 'tutu',tutu
    toto = 3,10,
    print 'toto',toto
    titi = 17,
    print 'titi',titi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tutu (4, 9)
    toto (3, 10)
    titi (17,)

    Disons que ce que tu dis est exact pour la définition et que ce que j’ai dit est exact pour la représentation.
    Mais j’avoue qu’en vérité j’avais bien les deux aspects en tête quand j’ai écrit ça, ce qui était faux.

    À trop vouloir être rigoureux , j’ai oublié la possibilité de ne pas mettre les parenthèses quand on définit un tuple.

    J’ai voulu trop bien faire, avec en tête la notion que les parenthèses qui participent toujours à la représentation d’un tuple (même le vide) sont aussi les signaux de définition d’un tuple.

    En fait , l’affichage , quelle que soit sa fonction, ne rend certainement pas compte des caractéristiques d’implémentation des représentations internes des structures de données. Les affichages sont conventionnels, l’interpréteur se débrouille pour déduire ce qu’il doit selon les circonstances, c’est à dire selon qu’il affiche une valeur ou qu’il lit une définition. De ce fait, il n’y a pas de signification absolue accordées aux parenthéses, mais ça n’a pas beaucoup d’importance, il faut connaître la syntaxe dans tous les cas de figure, point à la ligne.

Discussions similaires

  1. Question débutant: Affiche vertical et horizontal
    Par Hijack54 dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 09/02/2007, 13h24
  2. Réponses: 18
    Dernier message: 04/04/2006, 14h31
  3. question débutant xsl
    Par irnbru dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 30/03/2006, 18h20
  4. Question débutant ...
    Par Lypertrophie dans le forum Débuter
    Réponses: 4
    Dernier message: 25/10/2005, 19h00
  5. Réponses: 3
    Dernier message: 26/05/2004, 23h03

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